Richiami di Java Multithreading
Threads (subclassing) public class A { public void a_method { C t = new C(); //C t = new C(String name); t.start(); … } public class C extends Thread { public void run() { //implementazione di run } A non attende la fine del metodo start di t
Threads (delegation) public class A { public void a_method { C t = new C(); Thread th=new Thread(t); //Thread th=new Thread(t,new C(String name); th.start(); … } public class C extends B implements Runnable { public void run() { //implementazione di run } A non attende la fine del metodo start di th
Threads by name - INTERFACE Public class C implements Runnable { public void run() { //implementazione di run } }... String name=Nome della Thread; C aRunnableClass = new C(); Thread a = new Thread(aRunnableClass); Thread a = new Thread(aRunnableClass,name); … String vecchioNome=a.getName(); a.setName(Nuovo nome della Thread);
Richiamo dei metodi principali di Thread Thread a ; … a.start(); // attiva il metodo run a.yield(); //cede la CPU (sospensione non temporizzata) a.sleep(long milliseconds); // sospensione temporizzata a.sleep(long milliseconds, int nanoseconds); a.destroy();// distrugge la Thread Metodi Deprecati: a.stop();// interrompe il metodo run (termina) a.suspend();// sospende indefinitamente il metodo run a.resume();// riprende dopo una suspend
Controllo delle Threads boolean isAlive(); vero se la thread e attiva (dopo start, prima di stop) static int activeCount(); ritorna il numero di threads attive; static int enumerate(Thread threadArray[]); ritorna un vettore contenente tuttle le threads; static Thread currentThread(); ritorna la Thread corrente;
Controllo delle Threads: rendez-vous Class T extends Thread; T t1 = new T(); T t2 = new T(); t2.join(); // nel codice di t1 sospende lesecuzione di t1 fino al completamento di t2 ovvero fino a quando t2 sara considerata non attiva void join(); void join(long m); //sospendi, ma per non piu di m milliseconds void join(long m, int n); //sospendi, ma per non piu di // m milliseconds e n nanoseconds
Daemon Threads Ci sono due tipi di threads: user threads e daemon threads. La differenza sta nel fatto che lapplicazione/applet termina quando non ci sono piu user threads. Le daemon threads servono dunque per effettuare servizi a favore delle user threads. Tutte le threads di sistema sono daemon threads. void setDaemon(boolean on) boolean isDaemon ()
A simple Round Robin scheduler public class SimpleScheduler extends Thread { int timeslice; public SimpleScheduler(int t) { timeslice=t; setPriority(Thread.MAX_PRIORITY); setDaemon(true); } public void run() { while (true) try { sleep(timeslice); } catch (Exception e) {} } class TestThread extends Thread { public void run() {... } public class Test { public static void main (string args[]) { new SimpleScheduler(100).start(); TestThread t1,t2,t3; t1=new TestThread(); t2=new TestThread(); t3=new TestThread(); t1.start(); t2.start(); t3.start(); }
Concorrenza Attenzione! Occorre stare attenti alle variabili condivise tra più threads. (monitor, wait & notify)