Java Thread megallitasa (megoldva)

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

pl a thread even queuejaba rakott specialis poison pillel.

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?

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é!