Java Thread megallitasa (megoldva)

 ( heroes83 | 2012. augusztus 1., szerda - 11:57 )

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ás megjelenítési lehetőségek

A választott hozzászólás megjelenítési mód a „Beállítás” gombbal rögzíthető.

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/threadPrimitiveDeprecation.html

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+not+use+Thread.stop()+to+terminate+threads
------------------------
Everyone is a winner*

pl a thread even queuejaba rakott specialis poison pillel.

Kis szadista ;-)

Peldat tudsz ra mutatni?
--
Ki oda vagyik, hol szall a galamb, elszalasztja a kincset itt alant. | Gentoo Portal

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