Threads en JAVA Software Distribuı̈t - T5 - Threads Eloi Puertas i Prats Universitat de Barcelona Grau en Enginyeria Informàtica 27 de febrer de 2014 1 / 13 Eloi Puertas i Prats Software Distribuı̈t - T5 - Threads Threads en JAVA Processos concurrents Els Sistemes Operatius d’avui en dia, poden fer com si múltiples processos s’executin concurrentment en una sola CPU, fent que els recursos siguin de temps compartit entre els processos. 2 / 13 Eloi Puertas i Prats Software Distribuı̈t - T5 - Threads Threads en JAVA Perquè són útils els threads Aprofitament de múltiples processadors. Simplicitat del modelat. Gestió más sencilla d’events ası́ncrons. Interfı́cies d’usuari amb millor resposta. 3 / 13 Eloi Puertas i Prats Software Distribuı̈t - T5 - Threads Threads en JAVA Fils d’execució concurrents dins d’un procés. Threads. Un procés pot tenir fils d’execució paral.lels (Threads). Tots els fils estan compartint els mateixos recursos dins del procés. A parent process may spawn child processes. A process may spawn child threads a process parent process main thread child thread 1 child thread 2 child processes Concurrent processing within a process 4 / 13 Eloi Puertas i Prats Software Distribuı̈t - T5 - Threads Threads en JAVA Threads a Java La màquina virtual de java pemet que una aplicació tingui múltiples fils d’execució, executant-se concurrentment. Java proporciona una classe Thread: public class Thread extends Object implements Runnable Quan s’engega una JVM, normalment existeix un sol fil d’execució. Es continua executant els fils fins que: S’ha cridat al mètode exit() de la classe Runtime Tots les threads han acabat, ja sigui perquè han retornat de la crida del mètode run o perquè han llençat una excepció que s’ha propagat més enllà del mètode run. 5 / 13 Eloi Puertas i Prats Software Distribuı̈t - T5 - Threads Threads en JAVA Creació de Threads en Java Creant una classe que heredi de la classe Thread Creant una classe que implementi la interfı́cie Runnable i passant-la com a paràmetre al constructor de la classe Thread 6 / 13 Eloi Puertas i Prats Software Distribuı̈t - T5 - Threads Threads en JAVA Extenent un Thread en java Declarar una class que sigui una subclasse de Thread. Aquesta subclasse ha de sobrescriure el mètode run() de la classe Thread. Llavors es pot declarar una instància d’aquesta subclasse i començar la seva execució amb el mètode start() Thread ... run( ) sleep( ) start( ) RunThreads A Java application illustrating the use of Thread class 7 / 13 SomeThread myID run( ) Eloi Puertas i Prats Software Distribuı̈t - T5 - Threads Threads en JAVA Extenent un Thread en java p u b l i c c l a s s SimpleThread extends Thread { p u b l i c SimpleThread ( S t r i n g s t r ) { super ( s t r ) ; } p u b l i c v o i d run ( ) { f o r ( i n t i = 0 ; i < 1 0 ; i ++) { System . o u t . p r i n t l n ( i + ” ” + getName ( ) ) ; try { s l e e p ( ( l o n g ) ( Math . random ( ) ∗ 1 0 0 0 ) ) ; } c a t c h ( I n t e r r u p t e d E x c e p t i o n e ) {} } System . o u t . p r i n t l n ( ”DONE! ” + getName ( ) ) ; } } 8 / 13 Eloi Puertas i Prats Software Distribuı̈t - T5 - Threads Threads en JAVA Engegant dos threads que extenen de Thread p u b l i c c l a s s TwoThreadsDemo { p u b l i c s t a t i c v o i d main ( S t r i n g [ ] args ) { new SimpleThread ( ” Jamaica ” ) . s t a r t ( ) ; new SimpleThread ( ” F i j i ” ) . s t a r t ( ) ; } } 9 / 13 Eloi Puertas i Prats Software Distribuı̈t - T5 - Threads Threads en JAVA Implementat un Runnable i associar-lo amb un Thread en java Una altra forma de declarar un Thread és declarant una classe que implementi la interfı́cie Runnable. Llavors, aquest classe ha d’implementar forçosament el mètode run(). Finalmment, una instància d’aquesta classe es passa com a argument quan es crea el nou Thread, i s’engega amb el mètode start(). Thread ... RunThreads2 A Java application illustrating the use of the Runnable interface run( ) sleep( ) start( ) SomeThread2 myID Runnable run( ) 10 / 13 Eloi Puertas i Prats Software Distribuı̈t - T5 - Threads Threads en JAVA Implementat un Runnable p u b l i c c l a s s SimpleThread implements Runnable { p u b l i c SimpleThread ( S t r i n g s t r ) { super ( s t r ) ; } p u b l i c v o i d run ( ) { f o r ( i n t i = 0 ; i < 1 0 ; i ++) { System . o u t . p r i n t l n ( i + ” ” + getName ( ) ) ; try { s l e e p ( ( l o n g ) ( Math . random ( ) ∗ 1 0 0 0 ) ) ; } c a t c h ( I n t e r r u p t e d E x c e p t i o n e ) {} } System . o u t . p r i n t l n ( ”DONE! ” + getName ( ) ) ; } } 11 / 13 Eloi Puertas i Prats Software Distribuı̈t - T5 - Threads Threads en JAVA Engegant dos threads que implementen Runnabe p u b l i c c l a s s TwoThreadsDemo { p u b l i c s t a t i c v o i d main ( S t r i n g [ ] args ) { new Thread ( SimpleThread ( ” Jamaica ” ) ) . s t a r t ( ) ; new Thread ( SimpleThread ( ” F i j i ” ) ) . s t a r t ( ) ; } } 12 / 13 Eloi Puertas i Prats Software Distribuı̈t - T5 - Threads Threads en JAVA Resultat de l’Execució Code Source TwoThreadsDemo.java 13 / 13 Eloi Puertas i Prats Software Distribuı̈t - T5 - Threads