Vraagje...
Wanneer je gebruik maakt van ExecutorService en je wilt dat alle threads die deze executor service aanstuurt worden geannuleerd, dus niet alleen de Runnable tasks die nog in de queue staan die nog niet aan een thread zijn aangewezen, maar ook de Runnables die wel al draaien in een aangewezen Thread, wat moet je dan doen om de Threads "netjes" de nek om te draaien?
De bedoeling is dat wanneer ik mijn Android app afsluit (shutdown) ik ook netjes alle threads opruim en dus ook de threads die hardware aansturen netjes laat communiceren naar de externe hardware dat de verbinding wordt verbroken. Volgens mij heet dat in vakjargon een "graceful disconnect". Het gaat mij niet om de "graceful disconnect" zelf, maar om de threads die opgeruimd/gestopt moeten worden in Java.
Dus als ik bijvoorbeeld een "Thread.stopErMaarMee()" commando krijg, dan weet ik in de thread wel dat hoe ik binnen de thread aangeef aan de hardware "ik stop ermee, toedeledokie!", maar niet hoe ik dan deze thread laat stoppen zodat deze kan worden opgeruimd.
De bedoeling is dat ik ALLE threads die in de ExecutorService draaien met één commando aangeef om te stoppen/annuleren en dat dan binnen deze threads ook weer aan subthreads wordt aangegeven om er mee te stoppen.
Ik heb een voorbeeldtje gemaakt, dat helaas niet doet wat ik verwacht, namelijk doorgaan ipv stoppen!
Het voorbeeld in een notendop: mainthread en executor thread, main thread geeft opdracht om een counter van 10 tot 20 te laten tellen. executor thread wacht tussen elke "tel" 1 seconde. Main thread wacht tussen starten en stoppen 4 seconden. Dus teller zou maar tot 10+4 = 14 moeten tellen lijkt mij.
Maar na een interrupt gaat ie gewoon verder??? Huh?
Ik vergeet iets denk ik.... maar wat?
Hier de code:
Gaarne jullie hulp.
Wanneer je gebruik maakt van ExecutorService en je wilt dat alle threads die deze executor service aanstuurt worden geannuleerd, dus niet alleen de Runnable tasks die nog in de queue staan die nog niet aan een thread zijn aangewezen, maar ook de Runnables die wel al draaien in een aangewezen Thread, wat moet je dan doen om de Threads "netjes" de nek om te draaien?
De bedoeling is dat wanneer ik mijn Android app afsluit (shutdown) ik ook netjes alle threads opruim en dus ook de threads die hardware aansturen netjes laat communiceren naar de externe hardware dat de verbinding wordt verbroken. Volgens mij heet dat in vakjargon een "graceful disconnect". Het gaat mij niet om de "graceful disconnect" zelf, maar om de threads die opgeruimd/gestopt moeten worden in Java.
Dus als ik bijvoorbeeld een "Thread.stopErMaarMee()" commando krijg, dan weet ik in de thread wel dat hoe ik binnen de thread aangeef aan de hardware "ik stop ermee, toedeledokie!", maar niet hoe ik dan deze thread laat stoppen zodat deze kan worden opgeruimd.
De bedoeling is dat ik ALLE threads die in de ExecutorService draaien met één commando aangeef om te stoppen/annuleren en dat dan binnen deze threads ook weer aan subthreads wordt aangegeven om er mee te stoppen.
Ik heb een voorbeeldtje gemaakt, dat helaas niet doet wat ik verwacht, namelijk doorgaan ipv stoppen!
Het voorbeeld in een notendop: mainthread en executor thread, main thread geeft opdracht om een counter van 10 tot 20 te laten tellen. executor thread wacht tussen elke "tel" 1 seconde. Main thread wacht tussen starten en stoppen 4 seconden. Dus teller zou maar tot 10+4 = 14 moeten tellen lijkt mij.
Maar na een interrupt gaat ie gewoon verder??? Huh?
Ik vergeet iets denk ik.... maar wat?
Hier de code:
Java:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
| package com.example.threads; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; public class Counter { static int poolSize = 4; // 4 cores ExecutorService pool; public Counter() { pool = Executors.newFixedThreadPool(poolSize); } public void startCounter() { // uitgevoerd in een nieuwe thread pool.execute(new CountTask(10, 20)); } public void stopCounter() throws InterruptedException { // laat de uitvoerende thread eerder stoppen pool.shutdownNow(); } class CountTask implements Runnable { private final int startCounter; private final int finishCounter; CountTask(int startCounter, int finishCounter) { this.startCounter = startCounter; this.finishCounter = finishCounter; } public void run() { // print counter to console for (int counter = this.startCounter; counter <= this.finishCounter; counter++) { System.out.println("counter is: " + counter); try { // counter-thread 1 sec laten wachten Thread.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } } } } public static void main(String[] args) throws InterruptedException { Counter counter = new Counter(); counter.startCounter(); // uitgevoerd op de main-thread Thread.sleep(4000); // main-thread 4 sec laten wachten // stop de counter thread vanaf de main-thread. counter.stopCounter(); } } |
Gaarne jullie hulp.