capitolo 12 thread lucidi relativi al volume: java – guida alla programmazione james cohoon, jack...
TRANSCRIPT
Capitolo 12Thread
Lucidi relativi al volume:
Java – Guida alla programmazione James Cohoon, Jack Davidson
Copyright © 2004 - The McGraw-Hill Companies srl
Java – Guida alla programmazione - James Cohoon, Jack Davidson
Copyright © 2004 - The McGraw-Hill Companies srl
La storia finora I programmi sono costituiti da singoli flussi di controllo
Il flusso di controllo inizia nella prima istruzione del metodo main() e procede istruzione per istruzione fino all'ultima istruzione del metodo main()
Il flusso di controllo può essere passato temporaneamente ad altri metodi con le invocazioni, ma il controllo torna a main() dopo il completamento
I programmi con flussi di controllo singoli sono detti processi sequenziali
Single-threaded Program { Statement 1; Statement 2; ... Statement k;}
Although the statements within a singleflow of control may invoke other methods,the next statement is not executed until
the current statement completes
Sebbene un'istruzione all'interno di un solo flusso di controllo possa invocare altri metodi, l'istruzione che segue non viene eseguita finché la prima non è conclusa
Java – Guida alla programmazione - James Cohoon, Jack Davidson
Copyright © 2004 - The McGraw-Hill Companies srl
Processi La capacità di eseguire più processi contemporaneamente è
una caratteristica importante dei moderni sistemi operativi Un desktop utente potrebbe eseguire un browser, un IDE
di programmazione, un lettore di musica e un sistema di preparazione dei documenti
Java supporta la creazione di programmi con flussi di controllo concorrenti, i thread I thread sono eseguiti in un programma e utilizzano le sue
risorse per l'esecuzione Processi leggeri
Java – Guida alla programmazione - James Cohoon, Jack Davidson
Copyright © 2004 - The McGraw-Hill Companies srl
Processi
Java – Guida alla programmazione - James Cohoon, Jack Davidson
Copyright © 2004 - The McGraw-Hill Companies srl
Elaborazione multithread
Multithread Program { Statement 1; Statement 2; ... Statement i; ... Statement j; ... Statement m;}
Thread A { A Statement 1; A Statement 2; ... A Statement n; ... A Statement p;}
Thread B { B Statement 1; B Statement 2;
...
B Statement q;}
Thread C { C Statement 1; C Statement 2; ... C Statement r;}
This multithreaded programstarts up thread A to assist in
the program's task. Afterstarting the thread, the programcontinues with its next statement
This multithreaded program alsostarts up thread B to assist in theprogram's task. After starting thethread, the program continues with
its next statement
Thread A starts up thread C toassist it in its program subtask.After starting the thread, thread
A continues with its nextstatement
A multithreaded program ends when all of itsindividual flows of control (threads) end
Il programma a più thread avvia il thread A per delegare
parte delle operazioni del programma. Dopo aver
avviato il thread, il programma continua con
l'istruzione successiva
Un programma a più thread si conclude quando finiscono tutti i
flussi di controllo individuali (thread)
Il programma a più thread avvia anche il thread B per delegare parte
delle operazioni del programma. Dopo aver avviato il thread, il
programma continua con l'istruzione successiva
Il thread A avvia il thread C per delegare parte delle operazioni del
thread. Dopo aver avviato il thread C, il thread A continua con l'istruzione
successiva
Java – Guida alla programmazione - James Cohoon, Jack Davidson
Copyright © 2004 - The McGraw-Hill Companies srl
Timer e TimerTask Tra le altre, le classi Java java.util.Timer e java.util.TimerTask
supportano la creazione e la pianificazione di thread
La classe astratta Timer possiede metodi per creare thread dopo un ritardo specificato o in un tempo specifico public void schedule(TimerTask task, long m)
Esegue task.run() dopo m millisecondi. public void schedule(TimerTask task, long m, long n)
Esegue task.run() dopo m millisecondi. Poi esegue ripetutamente task.run() ogni n millisecondi.
public void schedule(TimerTask task, Date y) Esegue task.run() nel momento t.
Un thread può essere creato estendendo TimerTask e specificando una definizione per il metodo astratto run()
Java – Guida alla programmazione - James Cohoon, Jack Davidson
Copyright © 2004 - The McGraw-Hill Companies srl
Esecuzione dopo un ritardo La classe DisplayCharSequence estende TimerTask per supportare la
creazione di un thread che visualizza 20 copie del carattere desiderato (per esempio “H”, “A” o “N”)
Java – Guida alla programmazione - James Cohoon, Jack Davidson
Copyright © 2004 - The McGraw-Hill Companies srl
Utilizzo di DisplayCharSequence
public static void main(String[] args){DisplayCharSequence s1 =
new DisplayCharSequence('H');
DisplayCharSequence s2 =new DisplayCharSequence('A');
DisplayCharSequence s3 =new DisplayCharSequence('N');
}
Java – Guida alla programmazione - James Cohoon, Jack Davidson
Copyright © 2004 - The McGraw-Hill Companies srl
Defining DisplayCharSequenceimport java.util.*;public class DisplayCharSequence extends TimerTask {
private char displayChar;Timer timer;public DisplayCharSequence(char c) {
displayChar = c;timer = new Timer();timer.schedule(this, 0);
}
public void run() {for (int i = 0; i < 20; ++i) { System.out.print(displayChar);}
timer.cancel();}
}
Java – Guida alla programmazione - James Cohoon, Jack Davidson
Copyright © 2004 - The McGraw-Hill Companies srl
Implementazione di un metodo run() Un'implementazione sottoclasse del metodo astratto run() di
TimerTask generalmente è divisa in due parti La prima definisce l'azione specifica per l'applicazione che
il thread deve eseguire La seconda termina il thread
Il thread viene terminato quando viene completata l'azione specifica per l'applicazione
// run(): display the occurences of the character of interestpublic void run() {
for (int i = 0; i < 20; ++i) {System.out.print(displayChar);
}
timer.cancel();}
Desired action to beperformed by thread
Desired action iscompleted so threadis canceled
Azione che il thread deve compiere
L'azione desiderata è stata completata; pertanto, il thread viene chiuso
Java – Guida alla programmazione - James Cohoon, Jack Davidson
Copyright © 2004 - The McGraw-Hill Companies srl
Esecuzione ripetuta Esempio
Aggiornamento di un orologio ad ogni secondo
public static void main(String[] args){SimpleClock clock = new SimpleClock();
}
public class SimpleClock extends TimerTask {final static long MILLISECONDS_PER_SECOND = 1000;private JFrame window = new JFrame("Clock");private Timer timer = new Timer();private String clockFace = "";
public SimpleClock() {
window.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);window.setSize(200, 60);Container c = window.getContentPane();c.setBackground(Color.white);window.setVisible(true);
timer.schedule(this, 0, 1*MILLISECONDS_PER_SECOND);}
public void run() {Date time = new Date();Graphics g = window.getContentPane().getGraphics();g.setColor(Color.WHITE);g.drawString(clockFace, 10, 20);
clockFace = time.toString();g.setColor(Color.BLUE);g.drawString(clockFace, 10, 20);
}}
Java – Guida alla programmazione - James Cohoon, Jack Davidson
Copyright © 2004 - The McGraw-Hill Companies srl
Pianificazione di SimpleClock
timer.schedule(this, 0, 1*MILLISECONDS_PER_SECOND);
The millisecond delaybefore the thread is
first scheduled
The number ofmilliseconds betweenruns of the thread
Pausa in millisecondi prima della prima
esecuzione del thread
Numero di millisecondi tra
esecuzioni del thread
Java – Guida alla programmazione - James Cohoon, Jack Davidson
Copyright © 2004 - The McGraw-Hill Companies srl
Esecuzione all'orario scelto Esempio
Pianificazione di calendari a comparsa utilizzando la classe DisplayAlert
Java – Guida alla programmazione - James Cohoon, Jack Davidson
Copyright © 2004 - The McGraw-Hill Companies srl
Utilizzo di DisplayAlertpublic static void main(String[] args){
Calendar c = Calendar.getInstance();
c.set(Calendar.HOUR_OF_DAY, 9);c.set(Calendar.MINUTE, 30);c.set(Calendar.SECOND, 0);
Date studentTime = c.getTime();
c.set(Calendar.HOUR_OF_DAY, 18);c.set(Calendar.MINUTE, 15);c.set(Calendar.SECOND, 0);
Date danceTime = c.getTime();
DisplayAlert alert1 = new DisplayAlert("Prospective student meeting", studentTime);
DisplayAlert alert2 = new DisplayAlert("Dance recital", danceTime);
}
Java – Guida alla programmazione - James Cohoon, Jack Davidson
Copyright © 2004 - The McGraw-Hill Companies srl
Defining DisplayAlertimport javax.swing.JOptionPane;import java.awt.*;import java.util.*;
public class DisplayAlert extends TimerTask {private String message;private Timer timer;
public DisplayAlert(String s, Date t) {message = s + ": " + t;timer = new Timer();timer.schedule(this, t);
}
public void run() {JOptionPane.showMessageDialog(null, message);timer.cancel();
}}
Java – Guida alla programmazione - James Cohoon, Jack Davidson
Copyright © 2004 - The McGraw-Hill Companies srl
Sleeping I thread possono essere utilizzati per mettere in pausa un
programma La classe standard java.lang.Thread possiede un metodo di
classe sleep() per mettere in pausa un flusso di controllo
public static void sleep(long n) throws InterruptedException Mette in pausa il thread corrente per n millisecondi. Poi
lancia una InterruptedException.
Java – Guida alla programmazione - James Cohoon, Jack Davidson
Copyright © 2004 - The McGraw-Hill Companies srl
Esempio di sleeping Codice
Date t1 = new Date();System.out.println(t1);try {
Thread.sleep(10000);}catch (InterruptedException e) {}Date t2 = new Date();System.out.println(t2);
OutputFri Jan 31 19:29:45 EST 2003Fri Jan 31 19:29:55 EST 2003