Sziasztok!
Erdeklodni szeretnek, hogy hogyan tudnek megallitani tobb szallat, vagy csak egy darabot is?
belso osztaly kod:
public class StartButtonBelsoOsztaly implements ActionListener{
public void actionPerformed(ActionEvent ex) {
Thread elsoSzal = new Thread(new ElsoThreadBelsoOsztaly());
Thread masodikSzal = new Thread(new MasodikThreadBelsoOsztaly());
Thread harmadikSzal = new Thread(new HarmadikThreadBelsoOsztaly());
Thread negyedikSzal = new Thread(new NegyedikThreadBelsoOsztaly());
Thread otodikSzal = new Thread(new OtodikThreadBelsoOsztaly());
Thread hatodikSzal = new Thread(new HatodikThreadBelsoOsztaly());
elsoSzal.start();
masodikSzal.start();
harmadikSzal.start();
negyedikSzal.start();
otodikSzal.start();
hatodikSzal.start();
}
}
A fenti kod szepen teszi a dolgat, elinditom (egy gomb segitsgevel), elkezdi a szalakat futtatni (persze felvaltva), de szeretnek tobb gombot is betenni, amivel vagy az osszeset, vagy eggyesevel leallithatom a szalakat. Ha ebbol a kodbol nem vilagos, belinkelhetem a teljes kodot,
koszonom
Hozzászólások
Van a Threadnek egy interrupt függvénye, amivel tudod neki jelezni, hogy le kellene állnia. Ha ezt beállítod, akkor a Threaden belül tudod ellenőrizni az isInterrupted() függvvénnyel, hogy hívtak-e neki ilyet. Ha igen, akkor szépen befejezel mindent amit csinálsz, és kilépsz a run függvényből.
Van egy stop() függvény is, de én azt inkább nem használom...
Amúgy ajánlom ezt:
http://docs.oracle.com/javase/6/docs/technotes/guides/concurrency/threa…
elsoSzal.stop();
masodikSzal.stop();
harmadikSzal.stop();
negyedikSzal.stop();
otodikSzal.stop();
hatodikSzal.stop();
es a
elsoSzal.interrupt();
masodikSzal.interrupt();
harmadikSzal.interrupt();
negyedikSzal.interrupt();
otodikSzal.interrupt();
hatodikSzal.interrupt();
megoldast is kiprobaltam, jelenleg megy mind a kettovel, thx
Thread.stop()-ot nem kéne erőltetni: https://www.securecoding.cert.org/confluence/display/java/THI05-J.+Do+n…()+to+terminate+threads
------------------------
Everyone is a winner*
http://www.forward.com.au/javaProgramming/HowToStopAThread.html
grep hint: interrupt()
-
Barátkozás a Groovyval
pl a thread even queuejaba rakott specialis poison pillel.
Kis szadista ;-)
Peldat tudsz ra mutatni?
--
az alapmuben van :)
Ez arrol szol, hogy egyik szal (a Crawler) kulso leallitasa hogyan tudja maga utan vonni kulso beavatkozas nelkul a masik szal (az Indexer) automatikus leallitasat. De ez nem szol arrol, hogy a Crawlert hogyan kell kulsoleg leallitani, ugyanugy a jol ismert Thread.interrupt() metodus es az InterruptedException elkapasa itt is a modszer. Az egy dolog, hogy a Crawlertol fuggo szalakat a Crawler mar poison pillel le tudja allitani, de az OP kerdese nem is erre iranyul. A poison pill modszer amugy is csak akkor tud mukodni, ha van megosztott adatstruktura a ket szal kozott, ebben az esetben a feldolgozando fileok sora.
A Thread.interrupt() a jo megoldas egy szal kulso eroltetett leallitasara, de a fogado szalnak korrektul kell kezelnie az InterruptedExceptiont.
szerintem a Thread.interrupt() SOSEM lehet jo megoldas, es ha az ember szalakkal dolgozik, biztositsa a clean shutdown lehetoseget. erre egy jo megoldas a PP.
ennek ellenere lehetnek olyan szalak (ahogy elobb megbeszeltuk), amiknek egyaltalan nincs inputja, es ott akar lehet jo megoldas ez is. ettol en meg tovabbra sem rajongok erte :)
Azért én kíváncsi lennék, hogy mi a bajod az interrupt()-tal? Miért gondolod kevésbé jónak, mint a PP? A fent említett IndexingServicenél is simán megoldató lenne azzal is minden probléma nélkül. Annyi történne, hogy a queue.take() dobna egy InterruptedExceptiont, amit lekezelsz a while(true)-n kívül, azt már vége is a szálnak. Ez mitől nem clean shutdown?
Attól függ melyik a jobb, hogy mire van igény.
Ha pl. a queue-ban összegyűlik 1000 feldolgozandó elem akkor mindegyiken végig fog menni amíg nem érkezik egy PP. Ha interrupt()-ot használsz akkor meg "rögtön" le tudod lőni.
??? A te példádban is interrupt-tal van leállítva a consumer Thread, az teljesen korrekt megoldás.
Ez elso olvasasra valami nagyon agyafurt megoldasnak tunt :^), de valojaban csak egy flag, amit majd manualisan lekezelsz a loop-odban (mar ha van). interrupt()-al ellentetben blokkolt thread-en nem mu'kodik.
----------------------
"ONE OF THESE DAYS I'M GOING TO CUT YOU INTO LITTLE PIECES!!!$E$%#$#%^*^"
Attól fggően, hogy mire van szükséged én inkább ezeket ajánlanám:
CompletionService (ExecutorCompletionService)
ExecutorService (ThreadPoolExecutor)
___________________________
http://lorem.hu
Az emberi tudás mindenkié!
Ha esetleg Java7-et használsz, akkor inkább az új Fork-Join API-t használd: http://wiki.javaforum.hu/pages/viewpage.action?pageId=25034778
--
http://wiki.javaforum.hu/display/~auth.gabor/Home
köszönöm