Ik ben wat met threads in java aan het spelen. Ik heb een testcase gemaakt met:
TaskManager: Doet op dit moment niks, behalve wat tasks afschieten
Task: Basis voor een taak.
SomeTask: Een taak, subclass van task
AnotherTask: Een andere taak, subclass van task
Het is slechts een testcase zodat ik threads leer begrijpen en in de toekomst toe kan passen voor nuttige dingen.
Het valt me op dat wanneer overgeschakeld moet worden van SomeTask naar AnotherTask, dat er erg veel tijd verspilt wordt. De output staat gewoon 2 seconden stil.
Tijd voor de testcase code:
Task.java:
De code van SomeTast en AnotherTask (de code is gelijk, op de naam na. Ik plaats het dus 1 keer):
De taskmanager die nog niets doet:
Is er iemand die me uit kan leggen wat er hier gebeurd waardoor het overschakelen van SomeTask naar AnotherTask zo lang duurt? Als ik meer SomeTasks maak, wordt het overschakelen naar SomeTasks langer. Hetzelfde voor AnotherTasks. Wat gaat hier mis?
TaskManager: Doet op dit moment niks, behalve wat tasks afschieten
Task: Basis voor een taak.
SomeTask: Een taak, subclass van task
AnotherTask: Een andere taak, subclass van task
Het is slechts een testcase zodat ik threads leer begrijpen en in de toekomst toe kan passen voor nuttige dingen.
Het valt me op dat wanneer overgeschakeld moet worden van SomeTask naar AnotherTask, dat er erg veel tijd verspilt wordt. De output staat gewoon 2 seconden stil.
Tijd voor de testcase code:
Task.java:
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
| import java.lang.Thread; import java.util.concurrent.Semaphore; public class Task extends Thread { protected int id; protected String TaskName; private static int numTasks = 0; private static Semaphore lockId = new Semaphore(1); public Task() { try { lockId.acquire(); id = numTasks++; lockId.release(); } catch (InterruptedException e) { e.printStackTrace(); } // Now we are alive, but not running. // Make your own run function System.out.println("Task id: " + id + " Task name: " + TaskName + " I'm alive"); } public void printToConsole() { System.out.println("Task id: " + id + " Task name: " + TaskName); } }; |
De code van SomeTast en AnotherTask (de code is gelijk, op de naam na. Ik plaats het dus 1 keer):
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
| import java.util.concurrent.Semaphore; public class SomeTask extends Task { public SomeTask() { TaskName = "SomeTask"; } public void run() { doNothing(); doNothing(); doNothing(); doNothing(); doNothing(); } public void doNothing() { int i; for (i = 0; i < 100000000; i++) { } printToConsole(); } } |
De taskmanager die nog niets doet:
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
| import java.util.Vector; public class TaskManager { private Vector<Task> tasks; private int maxTasks; public TaskManager(int maxTasks) { tasks = new Vector<Task>(); this.maxTasks = maxTasks; } public void addTasks() { int i; for (i = 0; i < 10; i++) { tasks.add(new SomeTask()); tasks.lastElement().start(); } for (i = 0; i < 10; i++) { tasks.add(new AnotherTask()); tasks.lastElement().start(); } } } |
Is er iemand die me uit kan leggen wat er hier gebeurd waardoor het overschakelen van SomeTask naar AnotherTask zo lang duurt? Als ik meer SomeTasks maak, wordt het overschakelen naar SomeTasks langer. Hetzelfde voor AnotherTasks. Wat gaat hier mis?
You don't have to be crazy to do this job, but it helps ....