Vydělávej až 160.000 Kč měsíčně! Akreditované rekvalifikační kurzy s garancí práce od 0 Kč. Více informací.
Hledáme nové posily do ITnetwork týmu. Podívej se na volné pozice a přidej se do nejagilnější firmy na trhu - Více informací.

Diskuze: Thread: interrupt

Aktivity
Avatar
Lubor Pešek
Člen
Avatar
Lubor Pešek:19.9.2016 12:16

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.9.2016 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:19.9.2016 18:35

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í
+2,50 Kč
Řešení problému
Nahoru Odpovědět
19.9.2016 18:35
Totalitní admini..
Avatar
Lubor Pešek
Člen
Avatar
Lubor Pešek:19.9.2016 20:18

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.9.2016 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:19.9.2016 20:58

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.9.2016 20:58
Totalitní admini..
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.