75-62 Técnicas de Programación Concurrentes II Lic. Ing. Osvaldo Clúa 2008 Facultad de Ingeniería Universidad de Buenos Aires Introducción a los Threads Java Para crear un nuevo Thread ● Se extiende la clase Thread. – ● Pero esto significa crear un nuevo tipo de Thread. Se implementa la Interface Runnable – Que es la forma preferido. – Se debe hacer override al método run() FIUBA 2008 75-08 Sistemas Operativos Prof. Lic. Ing. Osvaldo Clúa 2 Un timer con un tick por segundo public class Timer01 implements Runnable { private int val = 0; boolean sigue = true; Timer01GUI miGUI; Timer01(Timer01GUI laGUI){ miGUI=laGUI; } public String toString(){ return String.valueOf(val); } private void inc() { val++; miGUI.setVal(toString()); } FIUBA 2008 public void run() { miGUI.setId(String.valueOf( Thread.currentThread().getId())); while (sigue) { try { Thread.sleep(1000); } catch (InterruptedException ex) { ex.printStackTrace(); } inc(); } } } 75-08 Sistemas Operativos Prof. Lic. Ing. Osvaldo Clúa 3 Estados de un thread FIUBA 2008 75-08 Sistemas Operativos Prof. Lic. Ing. Osvaldo Clúa 4 Proyecto ● Convertir el Timer en un CountDown. – Que comience cada instancia en un número distinto. – Que se detenga al llegar a cero. FIUBA 2008 75-08 Sistemas Operativos Prof. Lic. Ing. Osvaldo Clúa 5 java.util.concurrent.Executor public interface Executor { void execute(Runnable command); } ● Es una abstracción para la ejecución de Threads. – Provee soporte para el ciclo de vida de la ejecución, estadísticas, administración y monitoreo. – Separa la definición de las Threads de su mecánica de ejecución. FIUBA 2008 75-08 Sistemas Operativos Prof. Lic. Ing. Osvaldo Clúa 6 java.util.concurrent. ExecutorService ● Es una Sub Interface de Executor con los métodos para administrar el ciclo de vida. – Algunos de sus métodos son: boolean awaitTermination(long timeout, TimeUnit unit) boolean isShutdown() boolean isTerminated() void shutdown() List<Runnable> shutdownNow() FIUBA 2008 75-08 Sistemas Operativos Prof. Lic. Ing. Osvaldo Clúa 7 ThreadPoolExecutor implements ExecutorService ● ● Administra un pool de threads (worker Threads). – Las tareas se toman de una cola. – Las threads se reusan en lugar de crear una nueva cada vez. – El tamaño del pool puede fijarse. ScheduledThreadPoolExecutor – FIUBA 2008 Es una subclase que agrega planificación 75-08 Sistemas Operativos Prof. Lic. Ing. Osvaldo Clúa 8 java.util.concurrent Class Executors ● Es una Factory para crear objetos que implementan ExecutorService (y otras). static ExecutorService newCachedThreadPool() static ExecutorService newCachedThreadPool(ThreadFactory threadFactory) Crea los Threads que necesita, pero reusa si hay disponibles static ExecutorService newFixedThreadPool(int nThreads) static ExecutorService newFixedThreadPool(int nThreads, ThreadFactory threadFactory) Crea un pool con un número fijo de Threads FIUBA 2008 75-08 Sistemas Operativos Prof. Lic. Ing. Osvaldo Clúa 9 Ejemplo ● Para el CountDown (Timer modificado) ExecutorService eje = Executors.newFixedThreadPool(n / 2); for (int i = 0; i < n; i++) { eje.execute(tick[i]); } try { Thread.sleep(duerme); eje.shutdown(); } catch (InterruptedException ex) {} eje.shutdown(); System.out.println("Se pidió Shutdown"); } FIUBA 2008 75-08 Sistemas Operativos Prof. Lic. Ing. Osvaldo Clúa 10 Ejemplo Reusan el mismo thread Aún son se asignó thread ¿Qué pasó con el Shutdown? ● Repetir para otra cantidad de timers. ● Cambiar a shutdownNow() ● FIUBA 2008 75-08 Sistemas Operativos Prof. Lic. Ing. Osvaldo Clúa 11 Ejemplo ● ● Se usó un CachedThreadPool (observe la repetición del thread 14). Hágalo. FIUBA 2008 75-08 Sistemas Operativos Prof. Lic. Ing. Osvaldo Clúa 12 Interface Callable<V> V call() throws Exception ● Se la usa cuando se quiere que un worker thread devuelva un valor (cálculo asincrónico). Interface Future <V> V get() V get(long timeout, TimeUnit unit) boolean isDone() boolean Cancel() boolean isCancelled ● Representa el resultado del cálculo asincrónico. ● También se crean con ExecutorService FIUBA 2008 75-08 Sistemas Operativos Prof. Lic. Ing. Osvaldo Clúa 13 Ejemplo public class TraigoString implements Callable<String> { int duermo = 0; public TraigoString(int n) { duermo = n; } public String call() throws Exception { System.out.println("Comienza el calculo de "+duermo+ " soy "+Thread.currentThread().getId()); try { Thread.sleep(duermo * 1000); } catch (Exception exception) { } return (String.valueOf(duermo)); } } FIUBA 2008 75-08 Sistemas Operativos Prof. Lic. Ing. Osvaldo Clúa 14 Ejemplo public static void main(String[] args) { int cantThreads = 2; int cantFutures = 6; Future<String> result[] = new Future [cantFutures] ; ExecutorService eje = Executors.newFixedThreadPool(cantThreads); for (int i = 0; i < cantFutures; i++) { result[i] = eje.submit(new TraigoString(i)); } for (int i = 1; i < 10; i++) { impTerminado(result); //Imprime el resultado de los terminados try { Thread.sleep(i * 1000); // y lo pone en null } catch (Exception exception) { } if (todasNull(result)) break; //si todos los futuros terminaron System.out.println("Vuelta "+i); } System.out.println("Final"); System.exit(0); } } FIUBA 2008 75-08 Sistemas Operativos Prof. Lic. Ing. Osvaldo Clúa 15 Salida del Ejemplo run-single: Comienza el calculo de 0 soy 7 Comienza el calculo de 1 soy 8 Terminada la task 0 con el valor 0 Comienza el calculo de 2 soy 7 Comienza el calculo de 3 soy 8 Vuelta 1 Terminada la task 1 con el valor 1 Comienza el calculo de 4 soy 7 Vuelta 2 Terminada la task 2 con el valor 2 Comienza el calculo de 5 soy 8 Vuelta 3 Terminada la task 3 con el valor 3 Terminada la task 4 con el valor 4 Vuelta 4 Terminada la task 5 con el valor 5 Final FIUBA 2008 ● Complete y haga correr el Ejemplo. 75-08 Sistemas Operativos Prof. Lic. Ing. Osvaldo Clúa 16 Proyecto 1. Rehacer el Timer con a. Observador Observable. b. Un botón de Parcial (“Lap”) . c. Un botón de Start/Stop. d.Después del Stop, el Start vuelve a comenzar en cero. FIUBA 2008 75-08 Sistemas Operativos Prof. Lic. Ing. Osvaldo Clúa 17 Proyecto Start Lap Lap + Stop Continue FIUBA 2008 75-08 Sistemas Operativos Prof. Lic. Ing. Osvaldo Clúa 18