czwartek, lutego 11, 2010

Thread.stop() i "nieśmiertelne" wątki ;-)

Prawda jest taka, że powinienem już spać bo jest 3:10 w nocy, a to znaczy, że znów będę spał mniej niż 6 godzin. A to znów jest złe dlatego, że po 2-3 takich nocach się zły robię ;-)

Ale dyskusja pod postem o Ochidnej Echidnie [choć nie o projekcie, a o językach] zaprowadziła mnie do przeprowadzanie "badania" jak działa Thread.stop().
Ogólnie działa tak, że po zawołaniu na wątku metody stop() [gdy mamy do tego prawa] w wątku leci wyjątek [a tak naprawdę błąd] ThreadDeath, który kończy wykonanie wątku..... z tym, że kończy go dopiero po wyjściu z finally które "łapie" ten wyjątek...
A to oznacza....... a to oznacza, że jak się uprzemy to możemy zrobić "mniej śmiertelny wątek" ;-) jego kod wyglądać będzie tak:
public void run() {
try {
while (1==1) {
// niecna działalność wątka
}
} catch (ThreadDeath td) {
run(); // nieładnie ;-)
}
}

Gdy ktoś nam zawoła stop() na tym wątku, a jesteśmy w jego kodzie gdzieś między try, a catch to JVM wyrzuci do wątku ThreadDeath, które złapiemy, zignorujemy i wywołamy rekurencyjnie run() ;-)
Mamy potencjalnie nieśmiertelny wątek ;-)
Tylko potencjalnie bo taki wątek jest jednak nadal śmiertelny ;-) Po pierwsze gdy jesteśmy w catchu łapiącym ThreadDearh ktoś podstępnie może nam zawołać jeszcze raz stop() na wątku przez co ThreaDeath poleci jeszcze raz, ale tym razem już nie my go obsłużymy, a kod który wołał nasze run() :-)
Po drugie nawet gdy to stop() nie trafi na catch'a to po odpowiednio dużej liczbie wywołań rekurencyjnych Java sama nas wyrzuci :-)

I co z tego? Nico ;-) Fajnie wiedzieć, że można zrobić takie brzydkie coś, ale nie powinno się tego robić :-) to samo z użyciem stop() na wątku. Jest to nieładne, niekulturalne i oznacza prawdopodobnie trudne dzieciństwo ;-)


Podobne postybeta
Potfór ;-) czyli generator z yield w Java'ie
wait() i notify()/notifyAll() - najbardziej nierozumiane metody klasy Object ;-)
Warunki rozmyte ;-)
Modale dobre - confirm dla Androida :-)
Java 8 nadchodzi....