Java Threads - Universidad de Buenos Aires

Anuncio
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
Descargar