Conceptos Básicos de Concurrencia en Java

Documentos relacionados
Programación concurrente en Java

Laboratorio I Java Threads (Silberschatz Galvin)

Tema 6. Threads: programas multitarea

Ejecución de hebras. En realidad, todas las aplicaciones escritas en Java son aplicaciones multihebra (recuerde el recolector de basura).

Java Threads. Sistemas Distribuidos Rodrigo Santamaría

Tema 12: Programación multihilo

Java y JVM: programación concurrente. Adolfo López Díaz

Federico Peinado

Programación concurrente en Java. Breve introducción. Miguel Ángel LATRE Dept. de Informática e Ingeniería de Sistemas

TEMA 5: Control de la Concurrencia en Java (API Estándar)

Programación Concurrente en Java

Threads o Hilos. Un thread en JAVA comienza como una instancia de java.lang.thread antes de convertirse en un hilo de ejecución.

Programación Concurrente en Java: Threads. Ejemplos de programación concurrente. Luis Fernando Llana Díaz. 24 de abril de 2008

Procesamiento paralelo con hilos de Java

Programación concurrente Hebras

1. Fundamentos. Existen dos tipos distintos de multitarea: BASADA EN PROCESOS

Programación Concurrente en Java: Threads

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

Programación Orientada a Eventos

Programación concurrente

Apuntes de Java. Tema 10: Threads. Uploaded by Ingteleco

Introducción a los Threads Java

Java: Programación Multithread

EXCLUSIÓN MUTUA ENTRE HILOS. TEMA 5: Control de la Concurrencia en Java (API Estándar) Sintaxis para Bloques de Código Sincronizado

UNIDAD III.- Programación Concurrente

MONITORES EN JAVA. Antonio Tomeu Control de la Concurrencia en Java: API Estándar

Concurrencia en Java

CAPÍTULO III: Programación Concurrente en JAVA I: Programación con hilos

dit Programación concurrente Sincronización condicional UPM

Guillermo Román Díez

75-62 Técnicas de Programación Concurrente II 2004 java Threads

Hilos. Índice. Copyright Dept. Ciencia de la Computación e IA All rights reserved.

PROGRAMACION CONCURRENTE Y DISTRIBUIDA. III.3 Concurrencia con Java: Sincronización

PROGRAMACION CONCURRENTE Y DISTRIBUIDA. IV.3 Monitorización de excepciones en Threads

PROGRAMACIÓN EN JAVA. { una línea para definir, crear o ejecutar ; }

1 HILOS (THREADS) EN JAVA

Threads. La plataforma JAVA soporta programas multhreading a través del lenguaje, de librerías y del sistema de ejecución. Dos.

Tema 2: Aplicaciones Multihilo, Cliente Servidor

Tema 4: Control del flujo de ejecución: Excepciones y Threads. Programación Orientada a Objetos. Marcos López Sanz

Concurrencia en Android LSUB, GYSC, URJC

Práctica #0. Factoriales con Threads en Java. Pepper Pots (A ), Anthony Stark (A ) 18 de enero, 2017.

Concurrencia en Java

Ejemplo. class SiNoThread extends Thread { private String SiNo; static int Contador = 0; public SiNoThread(String s) { super(); SiNo = s; }

dit UPM Tema 2: Concurrencia /threads (java) Análisis y diseño de software José A. Mañas

Multienhebrado en Java Un toque de sincronización Transporte en Java Ejemplo conjunto

BENEMERITA UNIVERSIDAD AUTONOMA DE PUEBLA FACULTAD DE CIENCIAS DE LA COMPUTACIÓN LICENCIATURA EN CIENCIAS DE LA COMPUTACIÓN

Unidad IV: Programación concurrente (MultiHilos) 4.1. Concepto de hilo

PROGRAMACION CONCURRENTE

Asignatura. Taller de Computación VI. Módulo VI Threads

El servicio de echo con sockets

Concurrencia en Android LSUB, GYSC, URJC

Arquitecturas cliente/servidor

Programación Concurrente con Java

Unidad Didáctica 2. Elementos básicos del lenguaje Java Tipos, declaraciones, expresiones y asignaciones

TEMA 3: Creación y Control De Threads en Java

Monitores Ing. Iván Medrano Valencia

Java nos ofrece la clase Thread y la interfaz Runable que permiten que varios procesos estén funcionando de forma concurrente.

Examen parcial Convocatoria de junio de 2005 FUNDAMENTOS DE LA PROGRAMACIÓN

Java Threads. Sistemas Distribuidos Rodrigo Santamaría

2. Indica cuál de las siguientes afirmaciones es cierta:

Hebras y Sincronización en Java

Programación Concurrente en Java

PROGRAMACIÓN ORIENTADA A OBJETOS 10/02/2009. Examen de Java. Nombre: DNI: Titulación:

(THREADS) Ing. Laura Sandoval Montaño, Ing. Manuel Enrique Castañeda Castañeda PAPIME

Prueba final, parte 2 - Clave a Concurrencia Segundo semestre Universidad Politécnica de Madrid

CAPÍTULO 2. PROCESOS VS. HILOS

Primitivas de Sincronización

CAPÍTULO 3. PROCESOS VS. HILOS

MECANISMOS DE SINCRONIZACIÓN PROGRAMACIÓN CONCURRENTE Y PARALELA

Centro Asociado Palma de Mallorca. Antonio Rivero Cuesta

Clases abstractas e interfaces en Java

Introducción a Java LSUB. 30 de enero de 2013 GSYC

Diseño de tipos Igualdad, representación, código, copia y relación de orden

Clase 34. Hilos. Qué es un hilo?

Examen concurrencia Nov 2011

Aplicaciones Cliente-Servidor Con Datagramas

PROGRAMACION DISTRIBUIDA

Multitarea en Java. Rafa Caballero - UCM

Test : Conteste exclusivamente en una HOJA DE LECTURA ÓPTICA, no olvidando marcar que su tipo de examen es A.

PROGRAMACION CONCURRENTE Y DISTRIBUIDA. III.1 Concurrencia con Java: Thread Java

IMPLEMENTACIÓN DE REDES DE PETRI CON TIEMPO EN JAVA

CONCURRENCIA EN JAVA. Diseño de Sistemas Operativos Avanzados 2000/2001. Pedro Pablo Gómez Martín

Guía práctica de estudio 12: Hilos

PROGRAMACIÓN ORIENTADA A OBJETOS 1/7/2009. Examen de Java. Nombre: DNI: Titulación:

HOJA DE EJERCICIOS 5 PROGRAMACIÓN CON EXCEPCIONES EN JAVA

Transcripción:

Conceptos Básicos de Concurrencia en Java Ingeniería del Software II Curso 2010/2011 Sergio Ilarri Artigas silarri@unizar.es Parte del material está extraído de JavaSun y Java Tutorial: Copyright 1994-2007 Sun Microsystems, Inc. All Rights Reserved.

Índice Detallado Programación Concurrente Concepto de Thread Crear y Arrancar Threads Control de Threads: stop, suspend/resume, sleep join etc sleep, join, etc. Planificación de Threads Sincronización Otros

Concepto de Thread CPU virtual Varias tareas al mismo tiempo Clase Thread (java.lang) Creación: Clase A que implementa el interface Runnable Construir una instancia de Thread usando A Llamar a start(), t() sólo 1 vez

Crear y Arrancar Threads (I) public interface Runnable { abstract public void run(); Cualquier objeto puede convertirse en thread No argumentos, no excepciones, no valor de retorno, vida del thread class Animation implements Runnable {... Animation happy = new Animation("Mr. Happy"); Thread mythread = new Thread(happy); mythread.start();

Crear y Arrancar Threads (II) O arrancando en el constructor class Animation implements Runnable { Thread mythread; Animation (String name) { mythread = new Thread(this); mythread.start();...

Control de Threads (I) stop() método complementario de start() destruye el thread deprecated (Java 1.2) suspend(), resume() pausa y reanuda el thread Deprecated! Utilizar en su lugar Object.wait y Object.notify

Control de Threads (II) sleep(long millis) join() espera a que termine el thread isalive()

Planificación de Threads (I) Si sólo hay una CPU, sólo se ejecuta 1 thread cada vez Llamar a start() pone al thread en estado ejecutable, no lo ejecuta Los threads son normalmente interrumpibles pero no se asegura un reparto por tiempo (no time-slicing) setpriority( ) )

Planificación de Threads (II) Por tanto, hay que llamar a sleep() de vez en cuando No necesariamente se reanuda el thread al terminar el período try {Thread.sleep(1000); catch (InterruptedException e){ El método yield() pausa temporal- da paso a otros threads de igual prioridad

Ciclo de Vida

Otra Forma de Crear Threads class MyThread extends Thread { public void run() { MyThread t = new MyThread(); t.start(); Timer (en java.util): Ejecuta una TimerTask (implementa Runnable) tras un retardo

Resumiendo: Dos Métodos de Creación de Threads public class HelloRunnable implements Runnable { public class HelloThread extends Thread { public void run() { System.out.println("Hello from a thread!"); public void run() { System.out.println("Hello from a thread!"); public static void main(string args[]) { (new Thread(new HelloRunnable())).start(); public static void main(string args[]) { (new HelloThread()).start(); http://java.sun.com/docs/books/tutorial/essential/concurrency/runthread.html

Ejemplo: SleepMessages public class SleepMessages { public static void main(string args[]) throws InterruptedException { String importantinfo[] = { "Mares eat oats", "Does eat oats", "Little lambs eat ivy", "A kid will eat ivy too" ; for (int i = 0; i < importantinfo.length; i++) { //Pause for 4 seconds Thread.sleep(4000); //Print a message System.out.println(importantInfo[i]); http://java.sun.com/docs/books/tutorial/essential/concurrency/sleep.html

Ejemplo: SimpleThreads public class SimpleThreads { //Display a message, preceded by the name of the current thread static void threadmessage(string message) { String threadname = Thread.currentThread().getName(); System.out.format("%s: %s%n", threadname, message); private static class MessageLoop implements Runnable { public void run() { String importantinfo[] = { "Mares eat oats", "Does eat oats", "Little lambs eat ivy", "A kid will eat ivy too" ; try { for (int i = 0; i < importantinfo.length; i++) { //Pause for 4 seconds Thread.sleep(4000); //Print a message threadmessage(importantinfo[i]); catch (InterruptedException e) { threadmessage("i wasn't done!"); http://java.sun.com/docs/books/tutorial/essential/concurrency/simple.html

Ejemplo: SimpleThreads public static void main(string args[]) throws InterruptedException { //Delay, in milliseconds before we interrupt MessageLoop //thread (default one hour). long patience = 1000 * 60 * 60; //If command line argument present, gives patience in seconds. if (args.length > 0) { try { patience = Long.parseLong(args[0]) * 1000; catch (NumberFormatException e) { System.err.println("Argument must be an integer."); System.exit(1); http://java.sun.com/docs/books/tutorial/essential/concurrency/simple.html

Ejemplo: SimpleThreads threadmessage("starting MessageLoop thread"); long starttime = System.currentTimeMillis(); Thread t = new Thread(new MessageLoop()); t.start(); threadmessage("waiting for MessageLoop thread to finish"); //loop until MessageLoop thread exits while (t.isalive()) { threadmessage("still waiting..."); //Wait maximum of 1 second for MessageLoop thread to //finish. t.join(1000); if (((System.currentTimeMillis() - starttime) > patience) && t.isalive()) { threadmessage("tired of waiting!"); t.interrupt(); //Shouldn't be long now -- wait indefinitely it t.join(); threadmessage("finally!"); http://java.sun.com/docs/books/tutorial/essential/concurrency/simple.html

Problemas de Concurrencia public class MyStack { int index=0; char[] data=new char[10]; public void push(char c) { data[index]=c; index++; public char pop() { index--; return data[index]; PROBLEMA!!

Sincronización: Uso de Cerrojos Cada objeto en Java tiene un lock (cerrojo) asociado La palabra clave synchronized permite el acceso al lock: Espera en un pool por el cerrojo synchronized(objeto) { // Aquí se dispone ya del cerrojo Se libera de nuevo el cerrojo

Ejemplo de Uso public void samplemethod { synchronized(this) hi { public synchronized void samplemethod {

Métodos notify y wait (Object) wait(): libera cerrojo hasta que alguien avise (con notify o notifyall) )y entonces lo retoma notify(): despierta a 1 arbit. esperando en el cerrojo notifyall(): despierta a todos sólo 1 conseguirá el cerrojo Para llamarlos, hay que estar en posesión del cerrojo

Ejemplo de Uso de Wait y Notify public void guardedjoy() { //Simple loop guard. Wastes processor time. Don't do this! while(!joy) { System.out.println("Joy has been achieved!"); Espera activa http://java.sun.com/docs/books/tutorial/essential/concurrency/guardmeth.html

Ejemplo de Uso de Wait y Notify Espera inteligente public synchronized guardedjoy() { //This guard only loops once for each special event, which may not //be the event we're waiting for. while (!joy) { try { wait(); catch (InterruptedException e) { System.out.println("Joy and efficiency have been achieved!"); public synchronized notifyjoy() { joy = true; notifyall(); http://java.sun.com/docs/books/tutorial/essential/concurrency/guardmeth.html

Otros Métodos de Interés Variantes de wait(): wait(long millis) wait(long millis, int nanos)

Deadlocks Un thread A espera la liberación de un lock por parte de otro thread B que a su vez espera la liberación de un lock mantenido por A Es responsabilidad d del programador Obtener siempre los cerrojos en el mismo orden y liberarlos en orden inverso

Ejemplo de Deadlock public class Deadlock { static class Friend { private final String name; public Friend(String name) { this.name = name; public String getname() { return this.name; public synchronized void bow(friend bower) { System.out.format("%s: %s has bowed to me!%n", this.name, bower.getname()); bower.bowback(this); http://java.sun.com/docs/books/tutorial/essential/concurrency/deadlock.html

Ejemplo de Deadlock public synchronized void bowback(friend bower) { System.out.format("%s: %s has bowed back to me!%n", this.name, bower.getname()); public static void main(string[] args) { final Friend alphonse = new Friend("Alphonse"); final Friend gaston = new Friend("Gaston"); new Thread(new Runnable() { public void run() { alphonse.bow(gaston); ).start(); new Thread(new Runnable() { public void run() { gaston.bow(alphonse); ).start(); http://java.sun.com/docs/books/tutorial/essential/concurrency/deadlock.html

Otros ThreadGroup activecount getmaxpriority setmaxpriority resume stop suspend

Referencias Concurrency in Java - Tutorial. http://java.sun.com/docs/books/tutorial/essential/con currency/ Thread Programming, Paul Hyde, Sams, ISBN 0672315858, 528 pages. Thinking in Java, Bruce Eckel, Prentice Hall, 4th edition, ISBN 0131002872. Thinking in Java, 3th edition. Free download: http://mindview.net/books/tij/downloadsites