Avatar
Lubor Pešek
Člen
Avatar
Lubor Pešek:

Zdravíčko

ještě druhý ticket.
Můžete mi prosím někdo napsat jednoduchý example vlákna, které má dejme tomu nekonečný cyklus (s nějakou prodlevou, ať je sranda) a nějaký posluchač (a ještě lépe v jiné třídě) ho dokáže interrupnout?

Vím (a to i IDEčka krásně naznačují přeškrtnutím), že už se léta nepoužívá zastaralá metoda stop() a znám i důvod. Googlil jsem jak šílený a jediný example, co mi fungoval, tak byl interrupt po startu s nějakou prodlevou (ale v té samé třídě). Např.:

...
public void metoda(){
        vlakno.start();
        try{
        Thread.sleep(1000);
        }catch(InterruptedException exp){
        }
        vlakno.interrupt();
}
...

Pochopitelně je to jen útržek. Ale když jsem použil metodu interrupt() v jakémkoliv posluchači, tak pak nastává efekt, kdy posluchač ignoruje jakýkoliv delay, nic neinterrupne a vlákno si jede vesele dál.
Takže ještě jednou otázka/y:

  1. Jak interrupnout vlákno z reakce posluchače (ať už key či mouse listener).
  2. to samé, ale chci interrupnout vlákno v jiné třídě (předpokládám, že to bude asi podobné, ale chtěl bych řešení pro tento finální účel)
Odpovědět 19. září 12:16
Existují dva způsoby, jak vyřešit problém. Za prvé vyhoďte počítač z okna. Za druhé vyhoďte okna z počítače.
Avatar
Marian Benčat
Redaktor
Avatar
Marian Benčat:

Celkově dělat interrupt je takové skarede. Nejčastěji se dělá to, že to vlákno se opakuje dokud je nějaká proměnná true... Pak z hlavního master vlákna nastavis proměnnou na false. V hlavním vlákne pak joines ty worker vlákna a počkáš až skončí ( většinou po sobě třeba uklizeji). Pokud máš třeba nějaky standardni problém typu master, slaves, kde master soupe do fronty praci a workeri si ji berou a vykonávají, tak se to třeba ukončuje tak, že z mastera dáš do fronty N ukolu, kde ten úkol signalizuje (ukonči se) a N je počet worker threadů. V hlavním blake pak čekáš opět na ukončení všech. Nezapomeň na locky:)

Akceptované řešení
+20 Zkušeností
+1 bodů
Řešení problému
 
Nahoru Odpovědět  +1 19. září 18:35
Avatar
Lubor Pešek
Člen
Avatar
Lubor Pešek:

wow díky, já si myslel, že právě takhle je to špagetový kód:) takže dík za názor a jdu na to.

Nahoru Odpovědět 19. září 20:18
Existují dva způsoby, jak vyřešit problém. Za prvé vyhoďte počítač z okna. Za druhé vyhoďte okna z počítače.
Avatar
Marian Benčat
Redaktor
Avatar
Marian Benčat:

jinak.. vzhledme k tomu ze ten true nastavuje jen hlavni vlakno a osttatni jen ctou, tak tam lock ani nebude potřeba, pokud ti nevadí, že to vlákno slavea udela jednu iteraci navíc. Zalezi na pripadu.

 
Nahoru Odpovědět 19. září 20:58
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 4 zpráv z 4.