java threads esempi - pages.di.unipi.itpages.di.unipi.it/ricci/esercitazione1.pdf · runnable: a...
TRANSCRIPT
![Page 1: Java Threads esempi - pages.di.unipi.itpages.di.unipi.it/ricci/Esercitazione1.pdf · RUNNABLE: A thread in the runnable state is executing in the Java virtual machine but it may be](https://reader031.vdocuments.site/reader031/viewer/2022021706/5b91ba1409d3f211298c620b/html5/thumbnails/1.jpg)
Java Threads
esempi
![Page 2: Java Threads esempi - pages.di.unipi.itpages.di.unipi.it/ricci/Esercitazione1.pdf · RUNNABLE: A thread in the runnable state is executing in the Java virtual machine but it may be](https://reader031.vdocuments.site/reader031/viewer/2022021706/5b91ba1409d3f211298c620b/html5/thumbnails/2.jpg)
Creazionepublic class ProvaThread {
public static void main(String[] args) {
Runnable r = new MyRunnable();
Thread t = new Thread(r); . . . . }}
class MyRunnable implements Runnable {
public void run() { // codice del thread }
}
![Page 3: Java Threads esempi - pages.di.unipi.itpages.di.unipi.it/ricci/Esercitazione1.pdf · RUNNABLE: A thread in the runnable state is executing in the Java virtual machine but it may be](https://reader031.vdocuments.site/reader031/viewer/2022021706/5b91ba1409d3f211298c620b/html5/thumbnails/3.jpg)
Creazionepublic class ProvaThread {
public static void main(String[] args) {
Runnable r = new MyRunnable();
Thread t1 = new Thread(r, "pippo"); Thread t2 = new Thread(r, "pluto"); . . . }}
class MyRunnable implements Runnable {
public void run() {
Thread t = Thread.currentThread(); System.out.println("il mio nome e' " + t.getName()); System.out.println("il mio id e' " + t.getId()); System.out.println("t = " + t.toString());
// resto del codice del thread }}
Lo stesso runnable viene usato per i due threads
Nomi diversi a thread diversi
restituisce il thread che sta eseguendo MyRunnable
![Page 4: Java Threads esempi - pages.di.unipi.itpages.di.unipi.it/ricci/Esercitazione1.pdf · RUNNABLE: A thread in the runnable state is executing in the Java virtual machine but it may be](https://reader031.vdocuments.site/reader031/viewer/2022021706/5b91ba1409d3f211298c620b/html5/thumbnails/4.jpg)
Output
il mio nome e' plutoil mio id e' 8t = Thread[pluto,5,main]
![Page 5: Java Threads esempi - pages.di.unipi.itpages.di.unipi.it/ricci/Esercitazione1.pdf · RUNNABLE: A thread in the runnable state is executing in the Java virtual machine but it may be](https://reader031.vdocuments.site/reader031/viewer/2022021706/5b91ba1409d3f211298c620b/html5/thumbnails/5.jpg)
Creazionepublic class ProvaThread {
public static void main(String[] args) {
OggettoCondiviso so = new OggettoCondiviso(33);
Runnable r1 = new MyRunnable(11, so); Runnable r2 = new MyRunnable(22, so);
Thread t1 = new Thread(r1, "primo_th"); Thread t2 = new Thread(r2, "secondo_th"); }}
class MyRunnable implements Runnable {int num;OggettoCondiviso so;
MyRunnable(int num, OggettoCondiviso so) { this.num = num; this.so = so; }
public void run() { // codice del thread: utilizza so e num}
lo stesso oggetto viene passato a due threads
i parametri vengono passati al costruttore di MyRunnable
![Page 6: Java Threads esempi - pages.di.unipi.itpages.di.unipi.it/ricci/Esercitazione1.pdf · RUNNABLE: A thread in the runnable state is executing in the Java virtual machine but it may be](https://reader031.vdocuments.site/reader031/viewer/2022021706/5b91ba1409d3f211298c620b/html5/thumbnails/6.jpg)
Prioritàpublic class ProvaThread {
public static void main(String[] args) {
OggettoCondiviso so = new OggettoCondiviso(33);
Runnable r1 = new MyRunnable(11, so); Runnable r2 = new MyRunnable(22, so);
Thread t1 = new Thread(r1, "primo_th"); Thread t2 = new Thread(r2, "secondo_th");
t1.setPriority(Thread.MIN_PRIORITY); t2.setPriority(Thread.MAX_PRIORITY); System.out.println("ora t1 ha priorita' " + t1.getPriority()); System.out.println("ora t2 ha priorita' " + t2.getPriority());
}}
![Page 7: Java Threads esempi - pages.di.unipi.itpages.di.unipi.it/ricci/Esercitazione1.pdf · RUNNABLE: A thread in the runnable state is executing in the Java virtual machine but it may be](https://reader031.vdocuments.site/reader031/viewer/2022021706/5b91ba1409d3f211298c620b/html5/thumbnails/7.jpg)
Output
ora t1 ha priorita' 1ora t2 ha priorita' 10
![Page 8: Java Threads esempi - pages.di.unipi.itpages.di.unipi.it/ricci/Esercitazione1.pdf · RUNNABLE: A thread in the runnable state is executing in the Java virtual machine but it may be](https://reader031.vdocuments.site/reader031/viewer/2022021706/5b91ba1409d3f211298c620b/html5/thumbnails/8.jpg)
Lanciopublic class ProvaThread {
public static void main(String[] args) {
OggettoCondiviso so = new OggettoCondiviso(33);
Runnable r1 = new MyRunnable(11, so); Runnable r2 = new MyRunnable(22, so);
Thread t1 = new Thread(r1, "primo_th"); Thread t2 = new Thread(r2, "secondo_th");
t1.start(); t2.start();
}}
![Page 9: Java Threads esempi - pages.di.unipi.itpages.di.unipi.it/ricci/Esercitazione1.pdf · RUNNABLE: A thread in the runnable state is executing in the Java virtual machine but it may be](https://reader031.vdocuments.site/reader031/viewer/2022021706/5b91ba1409d3f211298c620b/html5/thumbnails/9.jpg)
Attesa Terminazionepublic class ProvaThread {
public static void main(String[] args) {
OggettoCondiviso so = new OggettoCondiviso(33);
Runnable r1 = new MyRunnable(so); Runnable r2 = new MyRunnable(so);
Thread t1 = new Thread(r1, "primo_th"); Thread t2 = new Thread(r2, "secondo_th");
t1.start(); t2.start();
try { t1.join(); t2.join(); } catch (Exception e){ System.err.println("errore"); } }}
![Page 10: Java Threads esempi - pages.di.unipi.itpages.di.unipi.it/ricci/Esercitazione1.pdf · RUNNABLE: A thread in the runnable state is executing in the Java virtual machine but it may be](https://reader031.vdocuments.site/reader031/viewer/2022021706/5b91ba1409d3f211298c620b/html5/thumbnails/10.jpg)
Sincronizzazione Esplicita
class MyRunnable implements Runnable { int iNum; OggettoCondiviso so;
MyRunnable(int iNum, OggettoCondiviso so) { this.iNum = iNum; this.so = so; }
public void run() {
synchronized(so) { so.conta = so.conta + 7; } }}
Sincronizzazione esplicita sull’oggetto so
![Page 11: Java Threads esempi - pages.di.unipi.itpages.di.unipi.it/ricci/Esercitazione1.pdf · RUNNABLE: A thread in the runnable state is executing in the Java virtual machine but it may be](https://reader031.vdocuments.site/reader031/viewer/2022021706/5b91ba1409d3f211298c620b/html5/thumbnails/11.jpg)
Sincronizzazione Esplicita
class MyRunnable implements Runnable { int iNum; OggettoCondiviso so;
MyRunnable(int iNum, OggettoCondiviso so) { this.iNum = iNum; this.so = so; }
public void run() {
synchronized(OggettoCondiviso.class) { OggettoCondiviso.iQuanti++; } }}
Sincronizzazione esplicita sulla classe OggettoCondiviso
per campi static
![Page 12: Java Threads esempi - pages.di.unipi.itpages.di.unipi.it/ricci/Esercitazione1.pdf · RUNNABLE: A thread in the runnable state is executing in the Java virtual machine but it may be](https://reader031.vdocuments.site/reader031/viewer/2022021706/5b91ba1409d3f211298c620b/html5/thumbnails/12.jpg)
Sincronizzazione Implicita
Sincronizzazione implicita sul metodo decrem: l’oggetto su cui avviene la sincronizzazione e’ quello su cui viene invocato il metodo decrem
class OggettoCondiviso { static int iQuanti = 0; int conta;
OggettoCondiviso(int conta) { this.conta = conta; iQuanti++; }
synchronized void decrem(int dec) { conta-=dec; }}
![Page 13: Java Threads esempi - pages.di.unipi.itpages.di.unipi.it/ricci/Esercitazione1.pdf · RUNNABLE: A thread in the runnable state is executing in the Java virtual machine but it may be](https://reader031.vdocuments.site/reader031/viewer/2022021706/5b91ba1409d3f211298c620b/html5/thumbnails/13.jpg)
Sincronizzazione Implicita
Sincronizzazione implicita sul metodo static decrQuanti
class OggettoCondiviso { static int iQuanti = 0; int conta;
OggettoCondiviso(int conta) { this.conta = conta; iQuanti++; }
static synchronized void decrQuanti() { iQuanti--; }}
![Page 14: Java Threads esempi - pages.di.unipi.itpages.di.unipi.it/ricci/Esercitazione1.pdf · RUNNABLE: A thread in the runnable state is executing in the Java virtual machine but it may be](https://reader031.vdocuments.site/reader031/viewer/2022021706/5b91ba1409d3f211298c620b/html5/thumbnails/14.jpg)
Wait
class MyRunnable implements Runnable { int iNum; OggettoCondiviso so;
public void run() {
try { synchronized(so) { while (so.conta < 1) so.wait();
so.conta-=2; } } catch (InterruptedException e) { System.out.println("uscito dalla wait per interruzione"); } }}
Sospende il thread fino a che un altro thread non esegue una
notify sullo stesso oggetto
Un altro thread ha lanciato un interrupt() a questo thread
![Page 15: Java Threads esempi - pages.di.unipi.itpages.di.unipi.it/ricci/Esercitazione1.pdf · RUNNABLE: A thread in the runnable state is executing in the Java virtual machine but it may be](https://reader031.vdocuments.site/reader031/viewer/2022021706/5b91ba1409d3f211298c620b/html5/thumbnails/15.jpg)
Notify
class MyRunnable implements Runnable { int iNum; OggettoCondiviso so;
public void run() {
synchronized(so) {
so.increm(2);
so.notify(); } }}
risveglia un thread che aveva eseguito una wait
sullo stesso oggetto
notifyAll() risveglia tutti i threads che avevano eseguito una wait
sullo stesso oggetto
![Page 16: Java Threads esempi - pages.di.unipi.itpages.di.unipi.it/ricci/Esercitazione1.pdf · RUNNABLE: A thread in the runnable state is executing in the Java virtual machine but it may be](https://reader031.vdocuments.site/reader031/viewer/2022021706/5b91ba1409d3f211298c620b/html5/thumbnails/16.jpg)
Interruptpublic class ProvaThread {
public static void main(String[] args) {
OggettoCondiviso so = new OggettoCondiviso(33);
Runnable r1 = new MyRunnable(11, so); Runnable r2 = new MyRunnable(22, so);
Thread t1 = new Thread(r1, "primo_th"); Thread t2 = new Thread(r2, "secondo_th");
t1.start(); t2.start();
t1.interrupt();
}}
![Page 17: Java Threads esempi - pages.di.unipi.itpages.di.unipi.it/ricci/Esercitazione1.pdf · RUNNABLE: A thread in the runnable state is executing in the Java virtual machine but it may be](https://reader031.vdocuments.site/reader031/viewer/2022021706/5b91ba1409d3f211298c620b/html5/thumbnails/17.jpg)
Yield
class MyRunnable implements Runnable { int iNum; OggettoCondiviso so;
MyRunnable(int iNum, OggettoCondiviso so) { this.iNum = iNum; this.so = so; }
public void run() {
// altre istruzioni
Thread.yeld();
// altre istruzioni }}
Il thread che sta eseguendo MyRunnable cede il processore
ad un altro thread
![Page 18: Java Threads esempi - pages.di.unipi.itpages.di.unipi.it/ricci/Esercitazione1.pdf · RUNNABLE: A thread in the runnable state is executing in the Java virtual machine but it may be](https://reader031.vdocuments.site/reader031/viewer/2022021706/5b91ba1409d3f211298c620b/html5/thumbnails/18.jpg)
Sleep
class MyRunnable implements Runnable { int iNum; OggettoCondiviso so;
MyRunnable(int iNum, OggettoCondiviso so) { this.iNum = iNum; this.so = so; }
public void run() {
// altre istruzioni
Thread.sleep(1000);
// altre istruzioni }}
Il thread che sta eseguendo MyRunnable cede il processore
ad un altro thread e dorme 1000 millis
![Page 19: Java Threads esempi - pages.di.unipi.itpages.di.unipi.it/ricci/Esercitazione1.pdf · RUNNABLE: A thread in the runnable state is executing in the Java virtual machine but it may be](https://reader031.vdocuments.site/reader031/viewer/2022021706/5b91ba1409d3f211298c620b/html5/thumbnails/19.jpg)
StatoNEW: A thread that has not yet started is in this state.
RUNNABLE: A thread in the runnable state is executing in the Java virtual machine but it may be waiting for other resources from the operating system such as processor.
BLOCKED: Thread state for a thread blocked waiting for a monitor lock. A thread in the blocked state is waiting for a monitor lock to enter a synchronized block/method or reenter a synchronized block/method after calling Object.wait.
WAITING: A thread is in the waiting state due to calling one of the following methods:
• Object.wait with no timeout
• Thread.join with no timeoutA thread in the waiting state is waiting for another thread to perform a particular action.
TIMED_WAITING: Thread state for a waiting thread with a specified waiting time. A thread is in the timed waiting state due to calling one of the following methods with a specified positive waiting time:
• Thread.sleep• Object.wait with timeout
• Thread.join with timeout
TERMINATED: A thread that has exited is in this state.
![Page 20: Java Threads esempi - pages.di.unipi.itpages.di.unipi.it/ricci/Esercitazione1.pdf · RUNNABLE: A thread in the runnable state is executing in the Java virtual machine but it may be](https://reader031.vdocuments.site/reader031/viewer/2022021706/5b91ba1409d3f211298c620b/html5/thumbnails/20.jpg)
Statopublic class ProvaThread {
public static void main(String[] args) {
OggettoCondiviso so = new OggettoCondiviso(33);
Runnable r1 = new MyRunnable(11, so); Runnable r2 = new MyRunnable(22, so);
Thread t1 = new Thread(r1, "primo_th"); Thread t2 = new Thread(r2, "secondo_th");
System.out.println("stato di t1 prima della start " + t1.getState()); t1.start(); t2.start();
System.out.println("stato di t1 " + t1.getState()); System.out.println("stato di t2 " + t2.getState());
try { t1.join(); System.out.println("stato di t1 dopo la join " + t1.getState()); } catch (Exception e) { System.err.println("errore"); } }} NON usare la getState() per le sincronizzazioni!!!
![Page 21: Java Threads esempi - pages.di.unipi.itpages.di.unipi.it/ricci/Esercitazione1.pdf · RUNNABLE: A thread in the runnable state is executing in the Java virtual machine but it may be](https://reader031.vdocuments.site/reader031/viewer/2022021706/5b91ba1409d3f211298c620b/html5/thumbnails/21.jpg)
Output
stato di t1 prima della start NEWstato di t1 TIMED_WAITINGstato di t2 RUNNABLEstato di t1 dopo la join TERMINATED
![Page 22: Java Threads esempi - pages.di.unipi.itpages.di.unipi.it/ricci/Esercitazione1.pdf · RUNNABLE: A thread in the runnable state is executing in the Java virtual machine but it may be](https://reader031.vdocuments.site/reader031/viewer/2022021706/5b91ba1409d3f211298c620b/html5/thumbnails/22.jpg)
Metodi Deprecated
stop()
suspend()
resume()
destroy()