Ik ben bezig om het een en ander multiThreaded te maken zodat er een hoop tijd bespaard kan worden. Maar om "duistere" reden krijg ik telkens een IllegalThreadStateException. Ik heb een ArrayList van alle Processen die uitgevoerd moeten worden. En ik heb een maximaal aantal lopende Threads ingesteld zodat niet alle processen uit de arraylist in 1x gaan lopen. Zodra er een Thread beschikbaar is mag de volgende uit de arraylist starten. Dit is de code waar het om gaat:
En dit is de klasse HQSubs. Heb het daadwerkelijke process even weggehaald aangezien dat niet van belang is nu. Daar word onder andere gewoon een .bat file uitgevoerd en gaat naar completed = true; zodra dat process afgerond is. Niks bijzonders. Dat process loopt circa 20 minuten.
De eerste 2 Threads worden uitgevoerd volgens plan. Gebeurt ook precies volgens mijn code. Zodra er 1 van de 2 Threads klaar is moet de volgende worden gestart omdat er nu maar 1 lopende Thread is. Op dat moment krijg ik de IllegalThreadStateException. Volgens mij betekend dat dat ik een Thread opnieuw aan wil maken wat niet mag. Alleen snap ik niet waarom ik deze Exception krijg. Wat doe ik verkeerd? Ik ben al uren bezig en kom er niet uit. Wie kan mij verder helpen?
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
| public void startConversie() //hqSubtitles is een arraylist van alle Threads die uitgevoerd gaan moeten worden. int maxThreads = 2; //Max aantal Threads int lopendeThreads = 0; //Aantal lopende Threads //Wachten totdat alle ondertitels omgezet zijn. boolean completed = false; while(!completed){ lopendeThreads = 0; completed = true; for(HQSubs s: hqSubtitles){ //Tel het aantal lopende Threads if(s.isAlive()){ lopendeThreads++; } if(!s.isCompleted()){ completed = false; } } //Max aantal Threads niet bereikt dus code mag uitgevoerd worden. if(lopendeThreads < maxThreads){ for(HQSubs s: hqSubtitles){ Thread.sleep(100); //Thread starten als deze nog niet completed is en het //aantal lopende Threads kleiner is als het max aantal Threads if(!s.isCompleted()){ s.start(); //Thread voor de eerste keer starten lopendeThreads++; //Anders word alles gestart omdat lopendeThreads niet bijgewerkt word Thread.sleep(1000); //Even wachten tot de Thread is gestart } } } Thread.sleep(100);//Even wachten om niet te veel belasting te creeren } } |
En dit is de klasse HQSubs. Heb het daadwerkelijke process even weggehaald aangezien dat niet van belang is nu. Daar word onder andere gewoon een .bat file uitgevoerd en gaat naar completed = true; zodra dat process afgerond is. Niks bijzonders. Dat process loopt circa 20 minuten.
Java:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
| public class HQSubs extends Thread{ private boolean completed; public HQSubs(){ completed = false; } @Override public void run(){ //Doe vanalles. completed = true; } public boolean isCompleted() { return completed; } } |
De eerste 2 Threads worden uitgevoerd volgens plan. Gebeurt ook precies volgens mijn code. Zodra er 1 van de 2 Threads klaar is moet de volgende worden gestart omdat er nu maar 1 lopende Thread is. Op dat moment krijg ik de IllegalThreadStateException. Volgens mij betekend dat dat ik een Thread opnieuw aan wil maken wat niet mag. Alleen snap ik niet waarom ik deze Exception krijg. Wat doe ik verkeerd? Ik ben al uren bezig en kom er niet uit. Wie kan mij verder helpen?
Ruisende versterker: schakel je subwoofer in.