Apuntes de Java. Tema 10: Threads. Uploaded by Ingteleco
|
|
|
- Pilar de la Fuente Santos
- hace 7 años
- Vistas:
Transcripción
1 Apuntes de Java Tema 10: Threads Uploaded by Ingteleco La dirección URL puede sufrir modificaciones en el futuro. Si no funciona contacta por
2 TEMA 10: THREADS INTRODUCCIÓN Los threads (hilos o hebras) son una aparición relativamente reciente en Informática, pero muy útiles. La idea fundamental es bien sencilla. En la programación tradicional hay un solo flujo de control, motivado fundamentalmente porque la máquina internamente suele tener un solo procesador (una sola "mente" que realiza las instrucciones, una tras otra). La programación multithreading (multienhebrada o multi-hilo) permite la ocurrencia simultánea de varios flujos de control. Cada uno de ellos puede programarse independientemente y realizar un trabajo, distinto, idéntico o complementario, a otros flujos paralelos. Hay miles de ejemplos en los que puede ser útil pensar en varios flujos de ejecución (threads): la posibilidad de editar mientras seguimos cargando o salvando un gran fichero, la posibilidad de visualizar una página mientras se están buscando las siguientes, la visualización de varios procesos que ocurren a la vez de forma independiente, etc. Para definir el concepto que iremos desgranando en este capítulo, diremos que un thread es un flujo de ejecución que ocurre independientemente de otros, que puede trabajar sobre datos distintos o compartidos, y que puede en un momento dado pararse, reiniciarse, sincronizarse o esperar a otros. Realmente no deberíamos llamar a esto multiprocesamiento sino multisubprocesamiento, porque lo que ocurre es que dentro del mismo proceso (compartiendo el mismo entorno volátil) surgen varios hilos de ejecución. El S.O. irá alternando entre procesos y además una vez que llegue a nuestro proceso alternará a su vez sobre cada uno de los hilos, creándose así multisubproceso. Esto tiene la ventaja de un menor tiempo de conmutación en comparación con el alternamiento clásico de procesos en un S.O CLASE JAVA.LANG.THREAD Para trabajar con threads en Java se utiliza la clase THREAD, del paquete java.lang. A continuación se presenta una breve descripción de los atributos y métodos más frecuentes de esta clase (esta información más ampliada se encuentra disponible en el API de Java): Atributos de clase: int MAX_PRIORITY - Prioridad máxima que puede tener un thread. int MIN_PRIORITY - Prioridad mínima. 10-1
3 int NORM_PRIORITY - La prioridad que se asigna por defecto. A cada thread Java se le da una prioridad numérica entre MIN_PRIORITY y MAX_PRIORITY (constantes definidas en la clase Thread). En un momento dado, cuando varios threads están listos para ejecutarse, el thread con prioridad superior será el elegido para su ejecución. Sólo cuando el thread para o se suspende por alguna razón, se empezará a ejecutar un thread con prioridad inferior. Constructores: Thread(): Crea un thread con nombre "Thread-" + N (siendo n un número secuencial). Thread( String name ): Crea un thread con el nombre indicado como parámetro. Thread( Runnable target ): Crea un thread asociado al objeto target. El nombre es "Thread-" + N. Thread( Runnable target, String name ): Como el anterior, pero asignándole el nombre que se pasa como parámetro. Thread(ThreadGroup group, String name): Crea un thread dentro de un grupo de threads que se pasa como primer parámetro, dándole un nombre como segundo parámetro. Thread( ThreadGroup group, Runnable target ): Como el anterior, pero asociándole un objeto Runnable. Thread(ThreadGroup group, Runnable target, String name): Como los anteriores, pasando todos los parámetros posibles: el grupo de hilos al que pertenece, el objeto Runnable asociado y el nombre del Thread. Métodos: static int activecount(): Devuelve el número actual de hilos activos en ese ThreadGroup. void checkaccess(): Comprueba el SecurityManager para determinar si el hilo actual tiene permiso para modificar este hilo. Las clases Thread y ThreadGroup tienen un método, checkaccess(), que llama al método checkaccess() del controlador de seguridad actual. El controlador de seguridad decide si permite el acceso basándose en los miembros del grupo de threads involucrado. Si el acceso no está permitido, el método checkaccess() lanza una excepción SecurityException. De otro modo el método checkaccess() simplemente retorna. La siguiente lista muestra varios métodos de ThreadGroup que llaman a checkaccess() antes de realizar la acción del método. Esto se conoce como acceso regulado, esto es, accesos que deben ser aprobados por el controlador de seguridad antes de poder ser completados. 10-2
4 ThreadGroup(ThreadGroup padre, String nombre) setdaemon(boolean isdaemon) setmaxpriority(int maxpriority) stop() suspend() resume() destroy() A su vez, la lista que se muestra a continuación es la lista de métodos de la clase Thread que llaman a checkaccess() antes de proceder: static Thread currentthread(): Devuelve una referencia al Thread que se está ejecutando en ese momento. void destroy(): Produce la salida inmediata del Thread, sin oportunidad de limpieza. static void dumpstack(): Imprime un rastro del Thread que se está ejecutando en ese momento. static int enumerate(thread[] tarray): Prepara un array de Threads que consiste en una copia de cada Thread activo en este ThreadGroup y sus subgrupos. String getname(): Devuelve el nombre del Thread. int getpriority(): Devuelve la prioridad del Thread. Por defecto, todos los hilos tienen la prioridad del hilo que iniciaron. Un hilo puede cambiar su prioridad llamando a setpriority(). ThreadGroup getthreadgroup(): Devuelve una referencia al ThreadGroup de este Thread. void interrupt(): Interrumpe el hilo especificado. static boolean interrupted(): Comprueba si el actual Thread ha sido interrumpido. boolean isalive(): Si el Thread especificado está vivo aún, devuelve true. Un Thread está vivo cuando es llamado su método start(), y permanece así hasta que muere. Este método devuelve true si el thread ha sido arrancado y no ha parado. Así, si el método isalive() devuelve false sabrás que se trata de un "Nuevo thread" o de un thread "Muerto". Por el contrario si devuelve true sabrás que el thread esá "Ejecutable" o "No Ejecutable". No se puede diferenciar entre un "Nuevo thread" y un thread "Muerto", como tampoco se puede hacer entre un thread "Ejecutable" y otro "No Ejecutable" 10-3
5 boolean isdaemon(): Si el Thread especificado es un demonio, devuelve true. Un Thread es un demonio cuando está diseñado para ejecutarse en background independientemente de cualquier interfaz de usuario. Cuando se hayan terminado todos los Threads de interfaz de usuario, y los únicos ejecutándose sean demonios, también termina la JVM. boolean isinterrupted(): Si este Thread ha sido interrumpido, devuelve true. void join(): Mezcla dos hilos que esperan a un tercero para morir. void join(long millis): Igual que el anterior, pero se limita la espera a los milisegundos indicados como parámetro. void join(long millis, int nanos): Al igual que el anterior, la espera se limita a los milisegundos y nanosegundos indicados. void run(): Comienza a ejecutar el objeto Runnable de destino del hilo, si hay alguno. void setdaemon(boolean on): Marca el Thread, tanto como de demonio o como de usuario, dependiendo del valor del parámetro. void setname(string name): Cambia el nombre del Thread. void setpriority(int newpriority): Comprueba si el Thread tiene permiso para modificar su propia prioridad. Si es así, configura la prioridad pedida. static void sleep(long millis): Causa que el Thread actual ceda el procesador y se deje de ejecutar durante el tiempo indicado en milisegundos. static void sleep(long millis, int nanos): Igual que el anterior, sólo que el tiempo se indica en milisegundos y nanosegundos. void start(): Llama a este hilo para que empiece a ejecutarse; la JVM llama al método run() del Thread. String tostring(): Devuelve una representación en un String del Thread con su nombre, prioridad, y ThreadGroup. static void yield(): Causa que el Thread actual ceda el procesador; el planificador permitirá que se ejecuten otros Threads. Versiones anteriores del JDK incluían algunos métodos adicionales en la clase Thread que no aparecen en la lista anterior como son: stop(), suspend() y resume(). En las versiones actuales del JDK estos métodos aparecen como Deprecated, es decir, obsoletos. A pesar de que aparecen todavía están en el API (por razones de compatibilidad), están en desuso. Sun determinó que tienden a conducir a interbloqueos, de modo que no recomiendan más su uso. 10-4
6 CREACIÓN DE THREADS Existen dos mecanismos que permiten la creación y manipulación de Threads: Creando objetos que deriven directamente de la clase THREAD Creando objetos que implementen el interfaces RUNNABLE INSTANCIANDO LA CLASE THREAD La manera más rápida de construir un programa multihilo es crear una instancia de la clase Thread, es decir, algo así: Thread mithread = new Thread(); Hay 7 constructores distintos para Thread que pueden llegar a recibir 3 parámetros: Threadgroup: Cada thread de Java es miembro de un grupo de threads. Los grupos proporcionan un mecanismo para la colección de varios threads dentro de un sólo objeto y la manipulación de esos threads de una vez, mejor que de forma individual. Por ejemplo, se puede arrancar o suspender todos los threads de un grupo con una sola llamada a un método. Los grupos de threads de Java están implementados por la clase ThreadGroup del paquete java.lang. El sistema de ejecución pone un thread dentro de un grupo durante su construcción. Cuando se crea un thread, también se puede permitir que el sistema de ejecución ponga el nuevo thread en algún grupo por defecto razonable o se puede especificar explícitamente el grupo del nuevo thread. El thread es un miembro permanente del grupo al que se unió durante su creación - no se puede mover un thread a otro grupo después de haber sido creado. Si se crea un nuevo Thread sin especificar su grupo en el constructor, el sistema de ejecución automáticamente sitúa el nuevo thread en el mismo grupo que del thread que lo creó (conocido como el grupo de threads actual y el thread actual, respectivamente). Cuando se arranca por primera vez una aplicación Java, el sistema de ejecución crea un ThreadGroup llamado "main". Entonces, a menos que se especifique otra cosa, todos los nuevos threads que se creen se convierten en miembros del grupo de threads "main". Runnable: Se utiliza para configurar un destino para el nuevo Thread a ejecutar. Si prescinde del mismo o lo configura como null, el nuevo Thread se inicia llamando al actual método run() del Thread. Si el nuevo Thread tiene un destino no null, entonces se invoca al método run() del destino al iniciar el nuevo Thread. String: Se utiliza para nombrar al nuevo Thread. En Java existen dos tipos de Threads: la mayor parte son hilos del usuario, tienen una interfaz de usuario y existen para servir a esta interfaz. Algunos hilos solamente se ejecutan en 10-5
7 background. Se denominan Threads demonio. Llamando a setdaemon() se puede especificar que un Thread es un demonio. Heredando de la clase Thread Además de crear instancias de la clase Thread, se puede hacer una clase que herede de la clase Thread. Para ello vamos a ver este ejemplo: class Thread1 extends Thread public void run() for( int i=0; i<100; i++ ) System.out.println( "1" ); class Thread2 extends Thread public void run() for( int i=0; i<100; i++ ) System.out.println( "2" ); Vemos que hasta aquí simplemente son dos clases cuyo método run(), una vez ejecutado, visualizará 100 caracteres "1" o "2" en pantalla. Nada extraño. Bien, pues vamos a hacer que se ejecuten a la vez. Para ello hemos hecho que desciendan de la clase Thread. Cualquier subclase de Thread permite después crear objetos y ejecutar su método run() (que debe redefinirse, ya que por omisión no hace nada) en paralelo con otros. Lo hacemos en esta clase principal: public class ThreadTest public static void main( String[] pars ) Thread1 t1 = new Thread1(); Thread2 t2 = new Thread2(); t1.start(); // Ejecuta t1.run() t2.start(); // Ejecuta t2.run() System.out.println( "Ahora estan los 2 en marcha" ); try t1.join(); // Espera hasta que acabe t1.run() t2.join(); // Espera hasta que acabe t2.run() catch( InterruptedException e ) System.out.println(); System.out.println( "Final de los 2 threads" ); 10-6
8 Aunque la salida dependerá de la máquina en la que se ejecute (velocidad de ejecución y tiempo de conmutación entre threads), un ejemplo de ejecución de esta clase puede ser este: Ahora estan los 2 en marcha Final de los 2 threads Extraño? Qué es lo que ha ocurrido? Sencillo, el objeto t1 ha ejecutado su método run() (eso es lo que hace el método start() que es el iniciador de todo thread) y ha escrito 100 "1"s en pantalla. Pero a la vez también se ha ejecutado el run() del objeto t2. El código de t1 y t2 se ejecuta simultáneamente, y obviamente no hay dos pantallas, por lo que han ido entremezclándose un grupo de 100 "1" y "2" en la pantalla. Es importante darse cuenta que en este programa existen tres hilos de ejecución diferentes: el hilo de ejecución del código del objeto t1, el hilo de ejecución del código del objeto t2 y el hilo de ejecución del método main() IMPLEMENTANDO EL INTERFACE RUNNABLE En el ejemplo anterior hemos hecho que nuestros threads extiendan la clase Thread. Si quisiéramos, dependiendo del problema con el que nos encontremos, que esos hilos heredaran además de alguna otra clase, como Applet, o Frame, o Panel, etc., tendríamos un problema, porque en Java no hay herencia múltiple. Para ello existe el interface Runnable. Este interface sólo tiene un método: public void run(), que tendrán que implementar obligatoriamente las clases que lo implementen. Por ejemplo, una clase que herede de Frame y que, además, tenga que ejecutarse junto con otros hilos de ejecución. Esta clase deberá implementar el interface Runnable, así como su método run(): class MiClase extends Frame implements Runnable... public void run() Para hacer que esto sea un hilo de ejecución, por otro lado habrá que crear un thread, asociándole en el constructor una instancia de esta clase: public static void main( String[] args ) MiClase clase = new MiClase(); Thread hilo = new Thread( clase ); 10-7
9 ... Cuando se invoque el método start() del thread, automáticamente llamará al método run() del objeto Runnable que se le asoció en el constructor, en este caso, a la instancia de MiClase. Vamos a ver ahora un ejemplo de utilización de Runnable con varios objetos: class MiEjecutable implements Runnable static long horainicio = System.currentTimeMillis(); int cont = 0; int num; MiEjecutable( int numobjeto ) num = numobjeto; public void run() while( System.currentTimeMillis() - horainicio < 3000) System.out.print( num ); // visualiza su número durante 3s. cont++; // cuenta el nº de visualizaciones public void visualizar() System.out.println("Objeto num." + num + " - " + cont + " veces." ); Vemos que esta clase simplemente se construye pasándole un número, y luego al ejecutarse el método run() se visualizará en pantalla ese número durante 3 segundos. Lo que vamos a hacer es crear varias instancias con distintos números y ejecutarlas a la vez para ver cómo se van intercalando: public class ThreadTest3 public static void main( String[] pars ) Thread [] t = new Thread [4]; MiEjecutable [] o = new MiEjecutable [4]; for (int i = 0; i < 4; i++) o[i] = new MiEjecutable( i ); t[i] = new Thread( o[i], "Objeto-" + i ); System.out.println( "nuevo Thread() " + (t[i] == null? "fallo" : "correcto") + " - " + t[i].getname() ); for (int i = 0; i < 4; i++) t[i].start(); try for (int i = 0; i < 4; i++) t[i].join(); 10-8
10 catch (InterruptedException e) System.out.println( ); for (int i = 0; i < 4; i++) o[i].visualizar(); Una salida de ejemplo es: nuevo Thread() correcto - Objeto-0 nuevo Thread() correcto - Objeto-1 nuevo Thread() correcto - Objeto-2 nuevo Thread() correcto - Objeto Objeto num veces. Objeto num veces. Objeto num veces. Objeto num veces. Puede ser un poco más difícil de entender cómo se ejecutan varios threads sobre el mismo objeto. Vemos ahora un ejemplo con un solo objeto: class Hilo implements Runnable long horainicial = System.currentTimeMillis(); Hilo() System.out.println( "Creado nuevo objeto Hilo" ); 10-9
11 public void run() while (System.currentTimeMillis() - horainicial < 3000) // Espera un segundo: try Thread.sleep( 1000 ); catch (InterruptedException e) System.out.println( "Estoy en el hilo " + Thread.currentThread().getName() + " - segundo " System.currentTimeMillis()- horainicial)/ ); Básicamente, el método run() visualiza cada segundo de ejecución durante tres segundos. Obsérvese como funciona el método sleep(), que deja suspendido el thread durante los milisegundos que se indican. Ahora vamos a crear un objeto y ejecutar cuatro veces su método run() concurrentemente: public class ThreadTest4 public static void main( String[] pars ) Hilo a = new Hilo(); // un único objeto... for (int i=0; i < 4; i++) Thread t = new Thread(a); //...pero cuatro threads System.out.println( "nuevo Thread() " + (t == null? "fallo" : correcto") + " - " + t.getname() ); t.start(); Una posible salida de este programa es: Creado nuevo objeto Hilo nuevo Thread() correcto - Thread-1 nuevo Thread() correcto - Thread-2 nuevo Thread() correcto - Thread-3 nuevo Thread() correcto - Thread-4 Estoy en el hilo Thread-1 - segundo 1.04 Estoy en el hilo Thread-2 - segundo 1.04 Estoy en el hilo Thread-3 - segundo 1.04 Estoy en el hilo Thread-4 - segundo
12 Estoy en el hilo Thread-1 - segundo 2.03 Estoy en el hilo Thread-2 - segundo 2.03 Estoy en el hilo Thread-3 - segundo 2.09 Estoy en el hilo Thread-4 - segundo 2.09 Estoy en el hilo Thread-1 - segundo 3.08 Estoy en el hilo Thread-2 - segundo 3.08 Estoy en el hilo Thread-3 - segundo 3.08 Estoy en el hilo Thread-4 - segundo 3.08 Hay que pensar en esto como en que el mismo programa (el método run() sobre un mismo objeto) se está ejecutando a la vez con distintos flujos de control. Por supuesto, en este caso coincidirán todos los atributos (sean de clase o de instancia), las que sí serán distintas serán las variables locales del método run(). Una consideración: una vez que empieza a ejecutarse el método run(), sea cual sea la forma elegida de hacerlo, puede llamar a cualquier otro método de cualquier otro objeto y eso seguirá formando un thread propio de ejecución CICLO DE VIDA DE UN THREAD Un Thread desde su ejecución hasta su muerte pasa por diversos estados de vida. Estos estados y sus transiciones se muestran en la figura Nacido start Listo notify notifyall Expiración de Quantum En Ejecución Despachar (asignar a un procesador) Emitir solicitud de E/S Completar E/S wait sleep suspend En Espera Dormido Suspendido Bloqueado Expira el intervalo de sueño stop Muerto resume Figura 10.1: Estados por los que pasa un Thread 10-11
13 Un thread tras su creación pasa a estado LISTO de ahí puede pasar a EN EJECUCIÓ N o no, esto dependerá del Dispatcher. Una vez EN EJECUCIÓ N procesará su código hasta que se le acabe el quantum asignado por el S.O. o bien hasta que termine (si le da tiempo), o también se puede dar el caso de que alguien lo elimine mediante stop(). Los procesos pasaran a ejecución dependiendo de sus prioridades y haciendo un round robin. Una vez EN EJECUCIÓ N los threads pueden, o pasar a LISTO de nuevo (si se acaba el quantum) o pasar a otros estados, a saber: EN ESPERA, DORMIDO, SUSPENDIDO y BLOQUEADO. Esto dependerá de la ejecución de ciertos métodos sobre el Thread (o la ocurrencia de ciertos sucesos). Un Thread pasará a DORMIDO cuando se invoque el método sleep(), permanecerá así (sin consumir recursos) hasta que se le acabe el tiempo de "siesta", momento en el que volverá a LISTO. En este estado, el thread no consume recursos, es decir, no es candidato a serle asignado el procesador hasta que no despierte. El Thread pasará a BLOQUEADO cuando tenga que sufrir una espera debida a E/S, saldrá de este estado en cuanto termine la E/S (tampoco consume recursos mientras espera). El estado SUSPENDIDO es para aquellos Threads que han sufrido la invocación del método suspend(), en este estado permanecerán hasta que alguien los llame mediante resume(). Por supuesto tampoco consumen recursos en este estado. Y por último el Thread pasará a EN ESPERA cuando alguien invoque un wait(), entonces el Thread pasará a esperar en una cola. Esto implica que la próxima vez que se ejecute un notify(), el Thread que se despertará será el primero que entró. También podemos ejecutar notifyall(), de forma que sacamos a todos de la cola. Resumiendo, un thread entra en el estado "No Ejecutable" cuando ocurre uno de estos cuatro eventos: Alguien llama a su método sleep(). Alguien llama a su método suspend(). El thread utiliza su método wait() para esperar una condición variable. El thread está bloqueado durante la I/O. Esta lista indica la ruta de escape para cada entrada en el estado "No Ejecutable": Si se ha puesto a dormir un thread, deben pasar el número de milisegundos especificados. Si se ha suspendido un thread, alguien debe llamar a su método resume(). Si un thread está esperando una condición variable, siempre que el objeto propietario de la variable renuncie mediante notify() o notifyall(). Si un thread está bloqueado durante la I/O, cuando se complete la I/O
14 Un thread puede morir de dos formas: por causas naturales o siendo asesinado (parado). Una muerte natural se produce cuando su método run() sale normalmente. Se puede matar un thread en cualquier momento llamando a su método stop(). El método stop() provoca una terminación súbita del método run() del thread. Si el método run() estuviera realizando cálculos sensibles, stop() podría dejar el programa en un estado inconsistente. Normalmente, no se debería llamar al método stop() MÉTODOS SINCRONIZADOS Modificador synchronized El modificador synchronized puede aplicarse sobre un método: de instancia: indicando entonces que sólo puede haber un thread ejecutando un método sincronizado sobre el objeto correspondiente en cada momento. de clase: sólo un thread creado a partir de un objeto de la clase puede estar ejecutando un método sincronizado en cada momento. Por ejemplo: public class MiClaseThread implements Runnable... syncronized void m1( ) //Método de instancia sincronizado... syncronized static void m2( ) //Método de clase sincronizado... public void run() m1(); m2();... public static void main(string[] args) MiClaseThread z1=new MiClaseThread(); MiClaseThread z2=new MiClaseThread(); Thread t1=new Thread(z1); Thread t2=new Thread(z1); Thread t3=new Thread(z2); t1.start(); t2.start(); t3.start(); 10-13
15 En el método de instancia: Si t1 entra en el método m1() y, estando dentro, se pasa el control del procesador a t2, este thread no podrá entrar porque es un thread construido a partir de la misma instancia Runnable. Sin embargo el t3 sí podrá ejecutar ese método porque está creado a partir de otra instancia de la clase Runnable. En el método de clase: Si t1 entra en el método m2() y, estando dentro, se pasa el control del procesador a t2, este thread no podrá entrar porque es un thread construido a partir de la misma clase (MiClaseThread). t3 tampoco podrá ejecutar el método m2() por la misma razón, están instanciados a partir de la misma clase (MiClaseThread) Cuándo necesitaremos usar este mecanismo? Consideremos el siguiente ejemplo: Hay un algoritmo de ordenación que se llama ShakerSort para ordenar un vector de números, que funciona como una ordenación por burbuja que hace una pasada ascendente y otra descendente, y así sucesivamente. Podríamos hacer dos threads para que a la vez se hicieran las dos pasadas ascendente y descendente, un thread yendo hacia arriba y otro hacia abajo: public class ShakerSort implements Runnable boolean ascendente; static int[] v; // Vector de prueba ShakerSort( boolean esascendente ) ascendente = esascendente; public static void inicvector() // Inicializa v a 10 valores de prueba int [] v2 = 10, 2, 3, 9, 4, 6, 7, 5, 8, 1 ; v = v2; static String vector() String s = "[ "; for (int i = 0; i < v.length; i++ ) s += v[i] + " "; return s + "]"; public void run() if (ascendente) int actual; int pasada = 1; int ultimocambioanterior = v.length - 1; int ultimocambio; do actual = 0; ultimocambio = -1; while (actual < ultimocambioanterior) 10-14
16 if (v[actual] > v[actual+1]) intercambia( actual, actual+1 ); ultimocambio = actual; actual++; System.out.println( "A Ascendente - pasada " + pasada++ + " " + vector() ); ultimocambioanterior = ultimocambio; while (ultimocambioanterior > 0); System.out.println( "A Fin de burbuja ascendente! " + vector() ); else int actual; int pasada = 1; int ultimocambioanterior = - 1; int ultimocambio; do actual = v.length - 2; ultimocambio = actual + 1; while (actual > ultimocambioanterior) if (v[actual] > v[actual+1]) intercambia( actual, actual+1 ); ultimocambio = actual; actual--; System.out.println( "D Descendente – pasada " + pasada++ + " " + vector() ); ultimocambioanterior = ultimocambio; while (ultimocambioanterior < v.length - 2); System.out.println( "D Fin de burbuja descendente!" + vector() ); void intercambia( int i, int j ) int temp = v[i]; v[i] = v[j]; v[j] = temp; public static void main( String[] pars ) ShakerSort o = new ShakerSort( true ); inicvector(); System.out.println( "Prueba / Burbuja ascendente: " + vector() ); o.run(); System.out.println(); inicvector(); System.out.println( "Prueba de ShakerSort: " + vector() ); 10-15
17 ShakerSort odesc = new ShakerSort( false ); Thread t1 = new Thread(o); Thread t2 = new Thread(oDesc); t1.start(); t2.start(); try t1.join(); t2.join(); catch (InterruptedException e) Una posible salida de este ejemplo es: Prueba / Burbuja ascendente: [ ] A Ascendente - pasada 1 [ ] A Ascendente - pasada 2 [ ] A Ascendente - pasada 3 [ ] A Ascendente - pasada 4 [ ] A Ascendente - pasada 5 [ ] A Ascendente - pasada 6 [ ] A Ascendente - pasada 7 [ ] A Ascendente - pasada 8 [ ] A Ascendente - pasada 9 [ ] A Fin de burbuja ascendente! [ ] Prueba de ShakerSort: [ ] D Descendente - pasada 1 [ ] A Ascendente - pasada 1 [ ] D Descendente - pasada 2 [ ] D Descendente - pasada 3 [ ] A Ascendente - pasada 2 [ ] D Descendente - pasada 4 [ ] D Descendente - pasada 5 [ ] D Fin de burbuja descendente![ ] 10-16
18 A Ascendente - pasada 3 [ ] A Ascendente - pasada 4 [ ] A Ascendente - pasada 5 [ ] A Ascendente - pasada 6 [ ] A Fin de burbuja ascendente! [ ] A qué se debe el problema? A que el vector existe sólo una vez y, si tenemos mala suerte, puede ocurrir que el grupo de sentencias: if( v[actual] > v[actual+1]) intercambia( actual, actual+1 );... se ejecute a la vez sobre la misma pareja de valores en los dos threads. Al ocurrir eso puede pasar que el flujo de control de cada thread se corte en cualquier punto intermedio para ejecutarse la otra, por lo que en el peor de los casos los dos threads pueden comparar la misma pareja reconociendo que están en orden inverso y ejecutando dos el método intercambia(). Esta situación es la crítica en códigos de threads. Hay que identificar qué métodos no pueden ser ejecutados a la vez en varios threads y marcarlos como synchronized: esto significará que si uno de los threads ha entrado en ese método ningún otro thread podrá entrar (ni a ese ni a ningún otro "sincronizado") hasta que el primero lo acabe. Así, los cambios serían, en el método run(): while (actual < ultimocambioanterior) if (hazintercambio( actual )) ultimocambio = actual; actual++; Y el método de intercambio: synchronized boolean hazintercambio( int i ) if (v[i] > v[i+1]) Thread.yield(); // Poner esto para causar problemas sin synchronized int temp = v[i]; v[i] = v[i+1]; v[i+1] = temp; return true; else return false; Pero esto no sería suficiente. Un método sincronizado lo marca el objeto si es de instancia. Esto es, cuando sobre el objeto o se ejecuta hazintercambio() otro thread no pueden entrar 10-17
19 en el método hazintercambio() con el mismo objeto, pero sí ejecutar el método hazintercambio() de otro objeto. Si queremos que no se ejecute ningún otro hazintercambio() cuando se está haciendo el primero, debemos hacerlo de clase: static synchronized boolean hazintercambio( int i ) Con esto la salida ya no tendrá problemas: Prueba de ShakerSort: [ ] A Ascendente - pasada 1 [ ] D Descendente - pasada 1 [ ] D Descendente - pasada 2 [ ] A Ascendente - pasada 2 [ ] D Descendente - pasada 3 [ ] A Ascendente - pasada 3 [ ] D Fin de burbuja descendente![ ] A Fin de burbuja ascendente! [ ] Uso de código synchronized No sólo los métodos pueden ser synchronized, también puede escribirse en cualquier punto un código precedido de la construcción synchronized (objeto)... De modo que el código entre llaves esperará a que no haya ningún método crítico (synchronized) ejecutándose sobre el objeto para empezar a ejecutarse, y hasta que acabe no dejará que ningún otro método o código crítico (indicado a su vez con synchronized) se ejecute
Tema 6. Threads: programas multitarea
Tema 6. Threads: programas multitarea Procesos e hilos Creación de threads Ciclo de vida de un thread Sincronización Prioridades Grupos de threads Relación de métodos Ejemplo sincronización 1 Procesos
Arquitecturas cliente/servidor
Arquitecturas cliente/servidor Creación de Sockets Cliente Servidor 1 Creación de Sockets Cliente/Servidor Sockets en TCP Concepto de Hilos Definición de DAEMON Sockets en UDP 2 THREADS 3 Qué es un thread?
Unidad IV: Programación concurrente (MultiHilos) 4.1. Concepto de hilo
Unidad IV: Programación concurrente (MultiHilos) 4.1. Concepto de hilo Hilo (theread) llamado también proceso ligero o subproceso, es la unidad de ejecución de un proceso y esta asociado con una secuencia
Ejecución de hebras. En realidad, todas las aplicaciones escritas en Java son aplicaciones multihebra (recuerde el recolector de basura).
Ejecución de hebras En realidad, todas las aplicaciones escritas en Java son aplicaciones multihebra (recuerde el recolector de basura). Hebras vs. Procesos Los cambios de contexto son más costosos en
Threads o Hilos. Un thread en JAVA comienza como una instancia de java.lang.thread antes de convertirse en un hilo de ejecución.
Threads o Hilos Los hilos son otra forma de crear la posibilidad de concurrencia de actividades; sin embargo, la gran diferencia es que los hilos comparten el código y el acceso a los datos. En cierta
Guillermo Román Díez
Concurrencia Creación de Procesos en Java Guillermo Román Díez [email protected] Universidad Politécnica de Madrid Curso 2016-2017 Guillermo Román, UPM CC: Creación de Procesos en Java 1/18 Concurrencia
Programación Orientada a Eventos
Programación Orientada a Eventos Técnicas de Programación Santiago Pavón V:2012.03.13 Programas Secuénciales El flujo de ejecución del programa sigue la secuencia de sentencias que lo forman. El estado
Federico Peinado www.federicopeinado.es
Federico Peinado www.federicopeinado.es Depto. de Ingeniería del Software e Inteligencia Artificial disia.fdi.ucm.es Facultad de Informática www.fdi.ucm.es Universidad Complutense de Madrid www.ucm.es
Programación Concurrente en Java: Threads. Ejemplos de programación concurrente. Luis Fernando Llana Díaz. 24 de abril de 2008
Departamento de Sistemas Informáticos y Computación Universidad Complutense de Madrid de abril de 00 Ejemplos de programación concurrente En un sistema operativo, diversos programas compiten por los recursos
Programación concurrente en Java
Diseño Y Aplicaciones de Sistemas Distribuidos Programación concurrente en Java Joan Vila DISCA / UPV Departament d Informàtica de Sistemes i Computadors Universitat Politècnica de València Threads en
CAPÍTULO 2. PROCESOS VS. HILOS
CAPÍTULO 2. PROCESOS VS. HILOS El objetivo de este capítulo es el de discutir con un poco más de profundidad todo lo relacionado con el concepto de proceso que sea relevante para el estudio de la programación
Java nos ofrece la clase Thread y la interfaz Runable que permiten que varios procesos estén funcionando de forma concurrente.
Threads (hilos) Java nos ofrece la clase Thread y la interfaz Runable que permiten que varios procesos estén funcionando de forma concurrente. Conceptos: Proceso (thread o hilo): es un programa en ejecución
Programación concurrente en Java. Breve introducción. Miguel Ángel LATRE Dept. de Informática e Ingeniería de Sistemas
Programación concurrente en Java. Breve introducción Miguel Ángel LATRE Dept. de Informática e Ingeniería de Sistemas Concurrencia en Java Hilos de ejecución Clase Thread e interfaz Runnable Pausas Interrupciones
Procesamiento paralelo con hilos de Java
Procesamiento paralelo con hilos de Java Tabla de contenidos 1. Soporte para hilos en Java... 1 2. Creación y control de un hilo... 2 2.1. Métodos de creación de un hilo... 2 2.2. Control de hilos mediante
Threads. La plataforma JAVA soporta programas multhreading a través del lenguaje, de librerías y del sistema de ejecución. Dos.
Threads Un thread es un flujo de control secuencial dentro de un programa. A los threads también se los conoce como procesos livianos ó contextos de ejecución. Un thread es similar a un programa secuencial:
Concurrencia en Java
Concurrencia en Java Herramientas proporcionadas por Java La Máquina Virtual (JVM) Pedro Pablo Gómez Martín La clase Thread Clase principal con la que conseguir concurrencia. La llamada a su método start()
Unidad Didáctica 3. Tipos genéricos. Fundamentos de Programación Departamento de Lenguajes y Sistemas Informáticos
Unidad Didáctica 3 Tipos genéricos Fundamentos de Programación Departamento de Lenguajes y Sistemas Informáticos Definición de tipo genérico Hablamos de un tipo genérico cuando el tipo en cuestión depende
PROGRAMACION CONCURRENTE
PROGRAMACION CONCURRENTE Ejemplos III: Sopa de Letras 1 Objetivo Mostrar las diferentes estrategias que puede seguir un gestor que tiene que ejecutar una tarea compleja que puede ser paralelizada en diferentes
CAPÍTULO III: Programación Concurrente en JAVA I: Programación con hilos
CAPÍTULO III: Programación Concurrente en JAVA I: Programación con hilos III. PROGRAMACION CON HILOS (THREADS) EN JAVA Java contiene una serie de clases y construcciones específicas para programar de forma
Java: Programación Multithread
Qué es un thread? Java: Programación Multithread Hasta el momento hemos desarrollado programas secuenciales con un único thread: en cualquier instante durante la ejecución de un programa hay un único punto
1 HILOS (THREADS) EN JAVA
1 HILOS (THREADS) EN JAVA 1.1QUÉ ES UN THREAD La Máquina Virtual Java (JVM) es un sistema multihilo. Es decir, es capaz de ejecutar varios hilos de ejecución simultáneamente. La JVM gestiona todos los
Programación Concurrente en Java: Threads
Departamento de Sistemas Informáticos y Computación Universidad Complutense de Madrid 7 de mayo de 007 Ejemplos de programación concurrente En un sistema operativo, diversos programas compiten por los
Tema III. Multihilo. Desarrollo de Aplicaciones para Internet Curso 12 13
Tema III. Multihilo Desarrollo de Aplicaciones para Internet Curso 12 13 Índice 1.Introducción 2.Tipos de Concurrencia 3.Hilos en Java 4.Implementación de un SNB i. Sin Hilos ii. Con Hilos iii.con Pool
Programación concurrente
Programación concurrente Java y Servicios Web I Master en Ingeniería Matemática Manuel Montenegro Dpto. Sistemas Informáticos y Computación Desp. 467 (Mat) [email protected] Programación concurrente
Concurrencia en Android LSUB, GYSC, URJC
Concurrencia en Android LSUB, GYSC, URJC Repaso de concurrencia en Java Crear un thread Instanciar un Thread, con el método run sobreescrito Intanciar un objeto que cumpla el interfaz Runnable y pasárselo
Multienhebrado en Java Un toque de sincronización Transporte en Java Ejemplo conjunto
Java y multiprogramación sobre red Sistemas Distribuidos ITInformática (UVA) César Llamas Bello 2003 Índice Multienhebrado en Java Un toque de sincronización Transporte en Java Ejemplo conjunto 26/02/2003
Tema 4: Control del flujo de ejecución: Excepciones y Threads. Programación Orientada a Objetos. Marcos López Sanz
Tema 4: Control del flujo de ejecución: Excepciones y Threads Programación Orientada a Objetos Marcos López Sanz Máster en Informática Gráfica, Juegos y Realidad Virtual MARCOS LOPEZ SANZ Excepciones Def.:
Java y JVM: programación concurrente. Adolfo López Díaz
Java y JVM: programación concurrente Adolfo López Díaz JVM Máquina virtual Ambiente de programación virtualizado Permite la ejecución de programas Java ejecutables multiplataforma Programación concurrente
Programación orientada a objetos. Resumen de Temas Unidad 5: Herencia
Programación orientada a objetos Resumen de Temas Unidad 5: Herencia 5.1 Introducción a la Herencia La herencia es el mecanismo fundamental de relación entre clases en la orientación a objetos. Relaciona
dit Programación concurrente Sincronización condicional UPM
20151028 dit UPM Programación concurrente Sincronización condicional Juan Antonio de la Puente Algunos derechos reservados. Este documento se distribuye bajo licencia Crea9ve Commons
Estructuras de control selectivas
Práctica 3 Estructuras de control selectivas Fundamentos de Programación Departamento de Lenguajes y Sistemas Informáticos Versión 2.0.2 Concepto de sentencia y estructura de control El cuerpo de los métodos
Multitarea en Java. Rafa Caballero - UCM
Multitarea en Java Rafa Caballero - UCM Programa Monoproceso (monotarea) En cada momento hay una única instrucción ejecutándose Se dice que el programa es monotarea, o monoproceso o monohebra (o single
Concurrencia. Primitivas IPC con bloqueo
Concurrencia Primitivas IPC con bloqueo Primitivas de IPC con bloqueo La solución de Peterson es correcta, pero tiene el defecto de requerir espera ocupada: Cuando un proceso quiere entrar en su región
Test : Conteste exclusivamente en una HOJA DE LECTURA ÓPTICA, no olvidando marcar que su tipo de examen es A.
SISTEMAS INFORMÁTICOS I Junio 2003 INGENIERÍA EN INFORMÁTICA - Código Carrera 55 - Código Asignatura 077 Tipo de Examen: A NO SE PERMITE EL USO DE NINGÚN MATERIAL Tiempo: 2 horas Apellidos: Nombre: DNI:
Programación Concurrente en Java
Hebras y monitores Departamento de Sistemas Informáticos y Programación Universidad Complutense de Madrid 21 de marzo de 2006 Threads Extendiendo la clase java.lang.thread. public class PrThread extends
Revisión del Concepto de Hilo (Thread) API Java parathreads: Marco General. Clase Thread: API Básica. TEMA 3: Creación y Control De Threads en Java
TEMA : Creación y Control De Threads en Java CONTENIDO Revisión del Concepto de Hilo Técnicas de Creación de Hilos Ciclo de Vida. Control de Hilos Prioridades Hilos y Sistemas Operativos BIBLIOGRAFÍA RECOMENDADA:
EJERCICIO Y EJEMPLO RESUELTO: USO DE LA INTERFAZ CLONEABLE DE JAVA. MÉTODO CLONE() PARA CLONAR OBJETOS. (CU00912C)
APRENDERAPROGRAMAR.COM EJERCICIO Y EJEMPLO RESUELTO: USO DE LA INTERFAZ CLONEABLE DE JAVA. MÉTODO CLONE() PARA CLONAR OBJETOS. (CU00912C) Sección: Cursos Categoría: Lenguaje de programación Java nivel
Ejemplo. class SiNoThread extends Thread { private String SiNo; static int Contador = 0; public SiNoThread(String s) { super(); SiNo = s; }
Qué son los threads? Todos los programadores conocen lo que es un proceso, la mayoría diría que es un programa en ejecución: tiene un principio, una secuencia de instrucciones y tiene un final. Un thread
Programación orientada a objetos
Repaso Programación orientada a objetos Curso INEM. Programación en Java Santiago Muelas Pascual [email protected]! Herencia! Superclase/subclase! super! Modificador protected! Redefinicion de métodos!
Hebras y Sincronización en Java
Hebras y Sincronización en Java Jonathan Makuc http://jmakuc.ublog.cl Noviembre 2008 Tópicos: 1. Introducción a hebras en Java...2 2. Hebras a través del clase Thread...3 3. Hebras a través de la interfaz
CONCURRENCIA EN JAVA. Diseño de Sistemas Operativos Avanzados 2000/2001. Pedro Pablo Gómez Martín
CONCURRENCIA EN JAVA Diseño de Sistemas Operativos Avanzados 2000/2001 Pedro Pablo Gómez Martín Concurrencia en Java 1 ÍNDICE ÍNDICE... 1 INTRODUCCIÓN... 3 CREAR UNA NUEVA HEBRA... 3 FINALIZACIÓN... 5
PROGRAMACIÓN ORIENTADA A OBJETOS 10/02/2009. Examen de Java. Nombre: DNI: Titulación:
Examen de Java Nombre: DNI: Titulación: 1. Cómo podemos compilar desde la línea de comandos la clase Java A que utiliza una librería empaquetada bd.jar? 2. Indica si es correcto el siguiente código. Justifica
INTERFACE ITERATOR DEL API JAVA. MÉTODO REMOVE PARA BORRAR OBJETOS EN COLECCIONES. EJERCICIOS Y EJEMPLO RESUELTO. (CU00919C)
APRENDERAPROGRAMAR.COM INTERFACE ITERATOR DEL API JAVA. MÉTODO REMOVE PARA BORRAR OBJETOS EN COLECCIONES. EJERCICIOS Y EJEMPLO RESUELTO. (CU00919C) Sección: Cursos Categoría: Lenguaje de programación Java
BENEMERITA UNIVERSIDAD AUTONOMA DE PUEBLA FACULTAD DE CIENCIAS DE LA COMPUTACIÓN LICENCIATURA EN CIENCIAS DE LA COMPUTACIÓN
BENEMERITA UNIVERSIDAD AUTONOMA DE PUEBLA FACULTAD DE CIENCIAS DE LA COMPUTACIÓN LICENCIATURA EN CIENCIAS DE LA COMPUTACIÓN PROGRAMACIÓN CONCURRENTE Y PARALELA PRACTICA 8 MONITORES BASADOS EN SEMÁFOROS
Carlos Montenegro. Programación Orientada a Objetos Proyecto Curricular de Ingeniería de Sistemas
2 - Introducción al lenguaje Java, identificadores y comentarios. Carlos Montenegro Programación Orientada a Objetos Proyecto Curricular de Ingeniería de Sistemas 1. Introducción: Java tiene como todos
Concurso: Cuánto sabes de JAVA?
Concurso: Cuánto sabes de JAVA? Motivación: o Para cambiar el ritmo de las jornadas y que no todas las actividades sean charlas o Recordar conocimientos y aprender algo nuevo. o Las preguntas pueden ayudarnos
CAPÍTULO 3. PROCESOS VS. HILOS
CAPÍTULO 3. PROCESOS VS. HILOS 3.1 Primitivas de sincronización en Java Java no tiene semáforos como primitivas de sincronización. Sin embargo, proporciona otras primitivas diferentes con las cuales sí
PROGRAMACION CONCURRENTE Y DISTRIBUIDA. III.1 Concurrencia con Java: Thread Java
PROGRAMACION CONCURRENTE Y DISTRIBUIDA III.1 Concurrencia con Java: Thread Java J.M. Drake L. Barros 1 Concurrencia en Java. Java posibilita la programación concurrente a través de threads. Los threads
Prueba N o 1. Programación II
UNIVERSIDAD ANDRÉS BELLO 1 Prueba N o 1 Programación II Profesores: José Luis Allende y Carlos Beyzaga. Fecha: 10 de Septiembre de 2013 Nombre: Nota: Instrucciones: Coloque su nombre a todas las hojas.
Concurrencia en Android LSUB, GYSC, URJC
Concurrencia en Android LSUB, GYSC, URJC Repaso de concurrencia en Java Crear un thread Instanciar un Thread, con el método run sobreescrito Intanciar un objeto que cumpla el interfaz Runnable y pasárselo
Programación Concurrente y Distribuida Ingeniería Informática Facultad de Ciencias Universidad de Cantabria.
Programación Concurrente y Distribuida Ingeniería Informática Facultad de Ciencias Universidad de Cantabria. Documento: Práctica 1 Sopa de Letras Autores: Fecha: Laura Barros J.M. Drake 5-6 Octubre Objetivo
Programación Concurrente con Java
Programación Concurrente con Java Diseño de Sistemas Operativos Facultad de Informática Juan Pavón Mestras Dep. Sistemas Informáticos y Programación Universidad Complutense Madrid Concurrencia En el mundo
Unidad V. Ya veremos qué poner en "algunas_palabras" y "algo_más", por ahora sigamos un poco más.
Implementación Orientada a Objetos. Unidad V 5.1 Estructura de una clase. Una clase consiste en: algunas_palabras class nombre_de_la_clase [algo_más] { [lista_de_atributos] [lista_de_métodos] Lo que está
UNIDAD III.- Programación Concurrente
UNIDAD III.- Programación Concurrente Sincronización Todo thread tiene una prioridad. Un thread hereda su prioridad, cuyo valor está entre 1 y 10 La prioridad puede modificarse con los métodos: setpriority()
Unidad Didáctica 2. Elementos básicos del lenguaje Java Tipos, declaraciones, expresiones y asignaciones
Unidad Didáctica 2 Elementos básicos del lenguaje Java Tipos, declaraciones, expresiones y asignaciones Fundamentos de Programación Departamento de Lenguajes y Sistemas Informáticos Versión 1.0.3 Índice
Tarea 2. Descripción y Control de Procesos
1 Tarea 2. 1. En qué consiste una traza de instrucciones? Consiste en listar las secuencias de instrucciones que ejecuta cada proceso. El procesador puede caracterizarse mostrando la forma en que intercalan
Centro Asociado Palma de Mallorca. Antonio Rivero Cuesta
Centro Asociado Palma de Mallorca Antonio Rivero Cuesta La Sintaxis de Java II... 6 Estructuras de control... 7 Estructuras de selección... 8 Sentencia if... 9 Sentencia if - else... 12 Operador condicional...
Qué es Java? Un lenguaje de programación Un entorno de desarrollo Un entorno de aplicación Un entorno de despliegue Es similar en sintaxis de C + +.
APUNTES DE JAVA Agenda Bienvenida Conociendo Java La Maquina Virtual Descargar e instalar el compilador El entorno de trabajo El paradigma de la programación orientada a objetos Qué es Java? Un lenguaje
Programación Orientada a Objetos. Resumen de Temas Unidad 3: Constructores y destructores
Programación Orientada a Objetos Resumen de Temas Unidad 3: Constructores y destructores 3.1 Conceptos de métodos constructor y destructor Java inicializa siempre con valores por defecto las variables
Ingeniería del Software Separación entre Presentación y Lógica del Negocio
Introducción En este laboratorio desarrollaremos una aplicación que verifica si una cuenta y un password son correctos. En dicha aplicación la presentación y la lógica del negocio se definirán en dos capas
Parte I: Programación en un lenguaje orientado a objetos
Parte I: Programación en un lenguaje orientado a objetos 1. Introducción a los lenguajes de programación 2. Datos y expresiones 3. Estructuras algorítmicas 4. Datos compuestos 5. Modularidad 6. Tratamiento
Asignatura. Taller de Computación VI. Módulo VI Threads
Asignatura Módulo VI Threads Elaboración Hugo Sanoguera, Fabián Gentile Este material pertenece a la materia, de la Carrera de Analista de Sistemas de Computación del INSTITUTO DE TECNOLOGÍA ORT. Todos
Práctica 4 Concurrencia en Java
Práctica 4 Concurrencia en Java Escuela de Ingeniería y Arquitectura Depto. de Informática e Ingeniería de Sistemas 1. Objetivos 1. Crear y manipular hilos de ejecución en Java 2. Utilizar monitores en
Procesos Definición y Estados
Procesos Definición y Estados Profesorado de Informática CeRP del Suroeste, Uruguay Contenidos Qué es un proceso Estructuras de datos para gestionar procesos API para trabajar con procesos Hilos (threads).
Ejercicios de Hilos. Índice
Índice 1 Creación de hilos (0.5 puntos)...2 2 Prioridades (0.5 puntos)... 2 3 Productor/Consumidor (1 punto)...2 4 Pool de hilos (1 punto)... 3 1. Creación de hilos (0.5 puntos) En la clase Ej1 se crean
Tema 2: EL TIPO DE DATOS ENTERO. INSTRUCCIÓN DE ASIGNACIÓN Y DE COMPOSICIÓN SECUENCIAL
Tema 2: EL TIPO DE DATOS ENTERO. INSTRUCCIÓN DE ASIGNACIÓN Y DE COMPOSICIÓN SECUENCIAL Cualquier duda sobre el contenido de este tema se puede enviar al foro TEORIA2. 2.1.- El tipo de datos entero (byte,
Centro Asociado Palma de Mallorca. Antonio Rivero Cuesta
Centro Asociado Palma de Mallorca Introducción Práctica de Programación Java Antonio Rivero Cuesta Sesión III La Sintaxis de Java II... 6 Estructuras de Control... 7 Estructuras de Selección... 8 Sentencia
18. Interfaces Declaración de una interfaz
Programación orientada a objetos con Java 191 18. Interfaces Objetivos: a) Definir el concepto de interfaz b) Interpretar el código fuente de una aplicación Java donde aparecen interfaces c) Construir
Ciclos. Recordando Estructuras de Control Básicas: SELECCIÓN (condición) SECUENCIAL
Ciclos Fundamentos de Programación Recordando Estructuras de Control Básicas: Una secuencia es una serie de estatutos que se ejecutan uno después de otro. Selección (condición) ejecuta diferentes estatutos
Programación Concurrente en Java
Programación Concurrente en Java Curso 2006-2007 9/2/2007 Prog. Distribuida Bajo Internet Qué es la Programación Concurrente? Diseño basado en varias actividades independientes Conceptualmente se ejecutan
TEMA 5: Control de la Concurrencia en Java (API Estándar)
TEMA 5: Control de la Concurrencia en Java (API Estándar) CONTENIDO Exclusión Mutua con código synchronized. Exclusión Mutua con métodos synchronized. Protocolos de Control de la Exclusión Mutua. Interbloqueos
Excepciones. Excepciones
Excepciones FJP Unidad 12 Excepciones Una excepción es la representación de una condición de error o cualquier situación no esperada en el resultado de un método. Son instancias de subclases de la clase
12. Tipos de atributos
Programación orientada a objetos con Java 135 12. Tipos de atributos Objetivos: a) Profundizar en el concepto de atributo de una clase e indicar los tipos de atributos en Java b) Interpretar el código
Programación concurrente y semáforos en Java
Programación concurrente y semáforos en Java En Java es posible ejecutar tareas en paralelo, utilizando hebras de control (hilos, threads). Este modo de programación permite tener un espacio de memoria,
Concurrencia en Java
Concurrencia en Java Concurrencia y Distribución Programación Avanzada Posgrado en Ciencia e Ingeniería de la Computación, UNAM 1. El mecanismo de threads Una aplicación Java o applet puede contener secciones
EXCLUSIÓN MUTUA ENTRE HILOS. TEMA 5: Control de la Concurrencia en Java (API Estándar) Sintaxis para Bloques de Código Sincronizado
TEMA 5: Control de la Concurrencia en Java (API Estándar) CONTENIDO Exclusión Mutua con código synchronized. Exclusión Mutua con métodos synchronized. Protocolos de Control de la Exclusión Mutua. Interbloqueos
TECNICAS DE PROGRAMACION Universidad Católica Los Angeles de Chimbote MODIFICADORES DE ACCESO A LOS MIEMBROS DE UNA CLASE
MODIFICADORES DE ACCESO A LOS MIEMBROS DE UNA CLASE Los modificadores de acceso, como su nombre indica, determinan desde qué clases se puede acceder a un determinado elemento. En Java tenemos 4 tipos:
Concurrencia Monitores. Guillermo Román Díez
Concurrencia Monitores Guillermo Román Díez [email protected] Universidad Politécnica de Madrid Curso 2016-2017 Guillermo Román, UPM CC: Monitores 1/25 Recursos Compartidos Pregunta La especificación de
HOJA DE EJERCICIOS 5 PROGRAMACIÓN CON EXCEPCIONES EN JAVA
Estructura de la Información en Programación I.T.I.G., Matemáticas. Curso 2008/2009 Nombre:... Fecha: / 01 / 2009 HOJA DE EJERCICIOS 5 PROGRAMACIÓN CON EXCEPCIONES EN JAVA Esta hoja de ejercicios nos servirá
MONITORES EN JAVA. Antonio Tomeu Control de la Concurrencia en Java: API Estándar
MONITORES EN JAVA Un monitor es un objeto que implementa acceso bajo e.m. a todos sus métodos, y provee sincronización En Java, son objetos de una clase cuyos métodos públicos son todos synchronized Un
Examen escrito de Programación 1
Examen escrito de Programación 1 Escuela de Ingeniería y Arquitectura Departamento de Informática e Ingeniería de Sistemas 31 de agosto de 2012 Disponer sobre la mesa en lugar visible un documento de identificación
7. Otras sentencias Sentencia break. 84 A. García-Beltrán y J.M. Arranz
84 A. García-Beltrán y J.M. Arranz 7. Otras sentencias Objetivos: a) Describir el funcionamiento de las otras sentencias de control (break, continue y try-catch) b) Interpretar el resultado de una secuencia
Agradecimientos. Nota de los autores. 1 Problemas, algoritmos y programas 1
Prologo Agradecimientos Nota de los autores Índice general I III V VII 1 Problemas, algoritmos y programas 1 1.1 Programas y la actividad de la programación.................... 4 1.2 Lenguajes y modelos
FACULTAD DE ECONOMIA Y ADMINISTRACION DEPARTAMENTO DE CIENCIAS DE LA COMPUTACION CÁTEDRA PROGRAMACION GENERAL. Trabajo Práctico Nº 4
Trabajo Práctico Nº 4 Ejercicios Teóricos 1. Indique si las siguientes afirmaciones son verdaderas o falsas a. La programación orientada a objetos hace uso de clases y envío de mensajes entre objetos..
1. Cuántas sentencias hay en la secuencia principal del siguiente programa?
1. Cuántas sentencias hay en la secuencia principal del siguiente programa? public class PruebaSwitch { System.out.print ("Opcion: "); case 3: System.out.println ("miércoles "); A. 1. B. 4. C. Más de 10.
Estructura de datos y Programación
Estructura de datos y Programación Tema: Conceptos Básicos- Estructuras de control - Arreglos Ing. Analia Méndez Ing. Raquel Zarco Año: 2012 ELEMENTOS DE UN PROGRAMA EN JAVA El programa Java consta de
IMPLEMENTACIÓN DE REDES DE PETRI CON TIEMPO EN JAVA
DEPARTAMENTO DE INFORMÁTICA E INGENIERÍA DE SISTEMAS LÍNEA DE INVESTIGACIÓN IMPLEMENTACIÓN DE REDES DE PETRI CON TIEMPO EN JAVA TRABAJO DE INVESTIGACIÓN Director: José Luís Villarroel Salcedo Doctorando:
JAVA 1. Introducción
Diseño de Interfaces de Usuario JAVA. Introducción. Características Portabilidad Interpretado (bytecodes) Uso de Máquina Virtual Java (JVM) Orientado a Objetos Jerarquía de clases Extensible (packages)
Ejercicio 1 (proyecto prlistas, paquete listas)
PRÁCTICA 3 Curso 2004-05 En esta práctica construiremos y usaremos dos paquetes: el primero, listas, que implementa listas genéricas y el segundo, colas, que implementa colas y colas de prioridades genéricas.
Programación multihebra
Programación multihebra by Scheme the API man 2000 ([email protected]) Qué es la programación multihebra? Podemos definir la programación multihebra o multihilo como un estilo de ejecucion en el que
Examen de Programación II (Ingeniería Informática)
Examen de Programación II (Ingeniería Informática) Septiembre 2010 1) Lenguaje C (2 puntos) Escribir el módulo "elimina_substring" (ficheros elimina_substring.h y elimina_substring.c) que defina una única
Si bien Pascal-FC no trae algunas de las características de Pascal como:
PROCESOS VS. HILOS: Ciclo de vida de un proceso: es prácticamente un estándar en todos los sistemas operativos. En principio el proceso no existe, es creado, luego pasa a listo (el proceso esta en condiciones
75-62 Técnicas de Programación Concurrente II 2004 java Threads
75-62 Técnicas de Programación Concurrente II 2004 java Threads FIUBA Ing. Osvaldo Clúa Bibliografía: tutorial de Java en http://java.sun.com Un buen libro (algo teórico) es Garg: Concurrent and Distributed
Introducción a Java. Introducción a Java. Programación I
Introducción a Java Introducción a Java Programación I Como Funciona Tipos de Datos TIPO TAMAÑO RANGO byte 8 bits Valores numéricos de 128 a 127 short 16 bits Valores numéricos de 32.768 a 32.767 int 32
