[ Pobierz całość w formacie PDF ]
Demon: Thread[Signal dispatcher,5,system]
Demon: Thread[Reference Handler,10,system]
Demon: Thread[Finalizer,8,system]
Demon: Thread[DEMON,5,main]
Okazuje się więc, że jedynym wątkiem w Javie po uruchomieniu programu (czyli bez
własnych wątków) nie będącym demonem jest wątek main. Demon jest więc wątkiem
działającym w tle. Jeżeli wszystkie istniejące wątki są demonami to Maszyna
Wirtualna kończy pracę. Podobnie można oznaczyć grupę wątków jako demon. Nie
oznacza to jednak, że automatycznie wszystkie wątki należące do tej grupy będą
demonami.
Poniższy przykład ukazuje sytuację, w której wszystkie aktualnie wykonywane wątki
przez Maszynę Wirtualną stanją się demonami. Wówczas maszyna kończy pracę.
Przykład 4.11:
//Duch.java
class Zly extends Thread{
Zly(){
super();
setName("Zly_demon");
//setDaemon(true);
}
public void run(){
while(!this.isInterrupted()){
}
}
}// koniec class Zly
class Cacper extends Thread{
Cacper(ThreadGroup g, String s){
super(g,s);
}
public void run(){
Zly z = new Zly();
z.start();
while(!this.isInterrupted()){
}
4-26
Jacek Rumiński - Język JAVA
Jacek Rumiński - Język JAVA Rozdział 4
Jacek Rumiński - Język JAVA
Jacek Rumiński - Język JAVA
}
}//koniec class Cacper
public class Duch {
public static void main(String args[]) {
ThreadGroup zle_duchy = new ThreadGroup("zle_duchy");
Cacper c = new Cacper(zle_duchy,"cacper");
c.start();
try{
Thread.currentThread().sleep(4000);
}catch (Exception e){}
ThreadGroup grupa = Thread.currentThread().getThreadGroup();
while(grupa.getParent() != null) {
grupa = grupa.getParent();
}
grupa.list();
c.interrupt();
try{
Thread.currentThread().sleep(4000);
}catch (Exception e){}
grupa = Thread.currentThread().getThreadGroup();
while(grupa.getParent() != null) {
grupa = grupa.getParent();
}
grupa.list();
}
}// koniec public class Duch
W powyższym kodzie stworzono trzy wątki: main -> cacper -> Zly_demon . Po
określonym czasie (4 sekundy) wątek cacper ginie śmiercią naturalną, zostawiając
pracujący wątek Zly_demon . Po uruchomieniu tego programu pokażą się dwa
wydruki o stanie wątków, po czym program zawiesi się (wieczna pętla wątku
Zly_demon ). Co ciekawe, jeżeli wywoła się polecenie wydruku stanu wątków
(CTRL-Break dla Windows) okaże się, że brak jest wątku o nazwie main . Jeżeli
powyższy kod ulegnie zmianie w ten sposób, że wątek Zly_demon uzyska status
demona, wówczas Maszyna Wirtualna przerwie pracę nawet jeżeli wątek
Zly_demon wykonuje wieczne działania.
Bibliografia
[1] Sun, Java Language Specification, Sun 1998
[2] Allen Hollub, Java Toolbox: Programming Java threads in the real world,
JavaWorld, http://www.javaworld.com/jw-04-1999/jw-04-toolbox.html, 1999
[3] Sun, The Java Tutorial, Sun 1998.
4-27
[ Pobierz całość w formacie PDF ]