Ik ben bezig met een java applicatie die meerdere threads gebruikt. De meeste threads voeren om de zoveel tijd een actie uit, maar liggen voor het grootste deel van de tijd te slapen.
Een thread, werkt een lijst met internetadressen af waarmee hij een verbinding probeert te maken, het grootste gedeelte van de tijd is hij bezig met het wachten op antwoord en het ontvangen van data.
Om het te stoppen probeer ik egbruik te maken van intterupt(). Deze methode zou alle slapende/wachtende threads een schop moeten geven waardoor ze verder gaan, ook wordt er een vlag (flag) gehesen, waarmee met behlup van isIntterupted() kan worden gekeken of de thread moet stoppen of niet.
Het probleem is echter dat intterupt() wordt genegereerd tijdens I/O operaties waardoor het programma gewoon blijft lopen.
In een ander topic stond hier over het volgende:
IK heb al wat gevonden over InterruptedIOException, maar als ik die probeer krijg ik de melding dat die nooit kan worden gegooit (InterruptedIOException is never thrown), waarschijnlijk omdat er nergens een sleep/wait staat.
Pseudo code:
Hoe zorg ik dat als een intterupt() wordt gedaan terwijl een connectie open is hij na het sluiten van het socket niet meer verder gaat?
Een thread, werkt een lijst met internetadressen af waarmee hij een verbinding probeert te maken, het grootste gedeelte van de tijd is hij bezig met het wachten op antwoord en het ontvangen van data.
Om het te stoppen probeer ik egbruik te maken van intterupt(). Deze methode zou alle slapende/wachtende threads een schop moeten geven waardoor ze verder gaan, ook wordt er een vlag (flag) gehesen, waarmee met behlup van isIntterupted() kan worden gekeken of de thread moet stoppen of niet.
Het probleem is echter dat intterupt() wordt genegereerd tijdens I/O operaties waardoor het programma gewoon blijft lopen.
In een ander topic stond hier over het volgende:
Het verbreken van de verbinding is echter niet mijn bedoeling. De thread mag gewoon de verbinding afwachten en netjes afsluiten, als hij maar niet weer een nieuwe opent.What if a thread doesn't respond to Thread.interrupt?
In some cases, you can use application specific tricks. For example, if a thread is waiting on a known socket, you can close the socket to cause the thread to return immediately. Unfortunately, there really isn't any technique that works in general. It should be noted that in all situations where a waiting thread doesn't respond to Thread.interrupt, it wouldn't respond to Thread.stop either. Such cases include deliberate denial-of-service attacks, and I/O operations for which thread.stop and thread.interrupt do not work properly.
IK heb al wat gevonden over InterruptedIOException, maar als ik die probeer krijg ik de melding dat die nooit kan worden gegooit (InterruptedIOException is never thrown), waarschijnlijk omdat er nergens een sleep/wait staat.
Pseudo 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
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
| class ControlClass { if(startCommand) { foobar1Thread.start(); foobar2Thread.start(); } if(stopCommand) { foobar1Thread.interrupt(); toobar2Thread.interrupt(); } } //stopt wel goed class foobar1 implements Runnable { private Thread myThread = Thread.currentThread(); public void run() { try { while(!myThread.isInterrupted()) { //ga een uurtje slapen als er niets meer te doen is if(!doeIets()) { int sleepTime = 3600000; Thread.sleep(sleepTime); } } } catch(InterruptedException e){ System.out.println("Thread Error: " + e); } } private boolean doeIets() { //blabla } } //stopt niet class foobar2 implements Runnable { private Thread myThread = Thread.currentThread(); public void run() { try { while(!myThread.isInterrupted()) { //ga een uurtje slapen als er niets meer te doen is if(!doeEenLoop()) { int sleepTime = 3600000; Thread.sleep(sleepTime); } } } catch(InterruptedException e){ System.out.println("Thread Error: " + e); } } //blijft doorgaan!!! :( private void doeEenLoop() { while(dataInDB && !myThread.interrupted()) { openConnectie(); } } private void openConnectie() { //open socket, I/O block, lang wachten enzo } } |
Hoe zorg ik dat als een intterupt() wordt gedaan terwijl een connectie open is hij na het sluiten van het socket niet meer verder gaat?
Aan de inhoud van de bovenstaande tekst kunnen geen rechten worden ontleend, tenzij dit expliciet in dit bericht is verwoord.

