Sei sulla pagina 1di 18

75-62 Tcnicas de Programacin Concurrentes II Lic. Ing. Osvaldo Cla 2 !

Facultad de Ingeniera Universidad de Buenos Aires

Introduccin 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 mtodo run()

%I&'( 2

75- ! "istemas O#erativos Pro$. Lic. Ing. Osvaldo Cla

Un timer con un tick por segundo


public class Timer01 implements Runnable { private int val = 0 boolean sigue = true Timer01!UI mi!UI Timer01"Timer01!UI la!UI#{ mi!UI=la!UI $ public %tring to%tring"#{ return %tring&value'("val# $ private void inc"# { val)) mi!UI&set*al"to%tring"## $ public void run"# { mi!UI&setId"%tring&value'(" Thread&currentThread"#&getId"### +hile "sigue# { tr, { Thread&sleep"1000# $ catch "Interrupted-.ception e.# { e.&print%tackTrace"# $ inc"# $ $ $

%I&'( 2

75- ! "istemas O#erativos Pro$. Lic. Ing. Osvaldo Cla

-stados de un thread

%I&'( 2

75- ! "istemas O#erativos Pro$. Lic. Ing. Osvaldo Cla

Pro,ecto

onvertir el Timer en un ount!o"n.

Que comience cada instancia en un n#mero distinto. Que se detenga al llegar a cero.

%I&'( 2

75- ! "istemas O#erativos Pro$. Lic. Ing. Osvaldo Cla

/ava&util&concurrent&-.ecutor
public inter(ace -.ecutor { void e.ecute"Runnable command# $

$s una abstracci%n para la e&ecuci%n de Threads.

Provee soporte para el ciclo de vida de la e&ecuci%n' estad(sticas' administraci%n ) monitoreo. Separa la definici%n de las Threads de su mec*nica de e&ecuci%n.
75- ! "istemas O#erativos Pro$. Lic. Ing. Osvaldo Cla 6

%I&'( 2

/ava&util&concurrent& -.ecutor%ervice

$s una Sub Interface de $xecutor con los mtodos para administrar el ciclo de vida.

+lgunos de sus mtodos son,

boolean a+aitTermination"long timeout0 TimeUnit unit# boolean is%hutdo+n"# boolean isTerminated"# void shutdo+n"# 1ist2Runnable3 shutdo+n4o+"#

%I&'( 2

75- ! "istemas O#erativos Pro$. Lic. Ing. Osvaldo Cla

ThreadPool-.ecutor implements -.ecutor%ervice

+dministra un pool de threads ("or-er Threads).


.as tareas se toman de una cola. .as threads se reusan en lugar de crear una nueva cada ve/. $l tama0o del pool puede fi&arse.

ScheduledThreadPool$xecutor

$s una subclase 1ue agrega planificaci%n


75- ! "istemas O#erativos Pro$. Lic. Ing. Osvaldo Cla !

%I&'( 2

/ava&util&concurrent 5lass -.ecutors

$s una 2actor) para crear ob&etos 1ue implementan $xecutorService () otras).

static ExecutorService newCachedThreadPool() static ExecutorService newCachedThreadPool(ThreadFactory threadFactory)


rea los Threads 1ue necesita' pero reusa si ha) disponibles

static ExecutorService newFixedThreadPool(int nThreads) static ExecutorService newFixedThreadPool(int nThreads, ThreadFactory threadFactory)
rea un pool con un n#mero fi&o de Threads
%I&'( 2 ! 75- ! "istemas O#erativos Pro$. Lic. Ing. Osvaldo Cla +

-/emplo

Para el ount!o"n (Timer modificado)


-.ecutor%ervice e/e = -.ecutors&ne+6i.edThreadPool"n 7 8# (or "int i = 0 i 2 n i))# { e/e&e.ecute"tick9i:# $ tr, { Thread&sleep"duerme# e/e&shutdo+n"# $ catch "Interrupted-.ception e.# {$ e/e&shutdo+n"# %,stem&out&println";%e pidi %hutdo+n;# $

%I&'( 2

75- ! "istemas O#erativos Pro$. Lic. Ing. Osvaldo Cla

-/emplo

Reusan el mismo thread

+#n son se asign% thread

3Qu pas% con el Shutdo"n4 Repetir para otra cantidad de timers. ambiar a shutdo"n5o"()
75- ! "istemas O#erativos Pro$. Lic. Ing. Osvaldo Cla ,,

%I&'( 2

-/emplo

Se us% un achedThreadPool (observe la repetici%n del thread 67). 8*galo.


! 75- ! "istemas O#erativos Pro$. Lic. Ing. Osvaldo Cla ,2

%I&'( 2

Inter(ace 5allable2*3
* call"# thro+s -.ception

Se la usa cuando se 1uiere 1ue un "or-er thread devuelva un valor (c*lculo asincr%nico).

Inter(ace 6uture 2*3


* get"# * get"long timeout0 TimeUnit unit# boolean is<one"# boolean 5ancel"# boolean is5ancelled

Representa el resultado del c*lculo asincr%nico. Tambin se crean con $xecutorService


! 75- ! "istemas O#erativos Pro$. Lic. Ing. Osvaldo Cla ,)

%I&'( 2

-/emplo
public class Traigo%tring implements 5allable2%tring3 { int duermo = 0 public Traigo%tring"int n# { duermo = n $ public %tring call"# thro+s -.ception { %,stem&out&println";5omien=a el calculo de ;)duermo) ; so, ;)Thread&currentThread"#&getId"## tr, { Thread&sleep"duermo > 1000# $ catch "-.ception e.ception# { $ return "%tring&value'("duermo## $ $

%I&'( 2

75- ! "istemas O#erativos Pro$. Lic. Ing. Osvaldo Cla

,*

-/emplo
public static void main"%tring9: args# { int cantThreads = 8 int cant6utures = ? 6uture2%tring3 result9: = ne+ 6uture 9cant6utures: -.ecutor%ervice e/e = -.ecutors&ne+6i.edThreadPool"cantThreads# (or "int i = 0 i 2 cant6utures i))# { result9i: = e/e&submit"ne+ Traigo%tring"i## $ (or "int i = 1 i 2 10 i))# { impTerminado"result# 77Imprime el resultado de los terminados tr, { Thread&sleep"i > 1000# 77 , lo pone en null $ catch "-.ception e.ception# { $ i( "todas4ull"result## break 77si todos los (uturos terminaron %,stem&out&println";*uelta ;)i# $ %,stem&out&println";6inal;# %,stem&e.it"0# $ $

%I&'( 2

75- ! "istemas O#erativos Pro$. Lic. Ing. Osvaldo Cla

,5

%alida del -/emplo


run@singleA 5omien=a el calculo de 0 so, B 5omien=a el calculo de 1 so, C Terminada la task 0 con el valor 0 5omien=a el calculo de 8 so, B 5omien=a el calculo de D so, C *uelta 1 Terminada la task 1 con el valor 1 5omien=a el calculo de E so, B *uelta 8 Terminada la task 8 con el valor 8 5omien=a el calculo de F so, C *uelta D Terminada la task D con el valor D Terminada la task E con el valor E *uelta E Terminada la task F con el valor F 6inal

omplete ) haga correr el $&emplo.

%I&'( 2

75- ! "istemas O#erativos Pro$. Lic. Ing. Osvaldo Cla

,6

Pro,ecto
6. Rehacer el Timer con
a. 9bservador 9bservable. b. :n bot%n de Parcial (;.ap<) . c. :n bot%n de Start=Stop. d.!espus del Stop' el Start vuelve a comen/ar en cero.

%I&'( 2

75- ! "istemas O#erativos Pro$. Lic. Ing. Osvaldo Cla

,7

Pro,ecto
%tart 1ap

1ap ) %top

5ontinue

%I&'( 2

75- ! "istemas O#erativos Pro$. Lic. Ing. Osvaldo Cla

,!

Potrebbero piacerti anche