-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathWorkPool.java
More file actions
84 lines (70 loc) · 2.02 KB
/
WorkPool.java
File metadata and controls
84 lines (70 loc) · 2.02 KB
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
77
78
79
80
81
82
83
84
import java.util.LinkedList;
/**
* Clasa ce implementeaza un "work pool" conform modelului "replicated workers".
* Task-urile introduse in work pool sunt obiecte de tipul PartialSolution.
*
*/
public class WorkPool {
int nThreads; // nr total de thread-uri worker
int nWaiting = 0; // nr de thread-uri worker care sunt blocate asteptand un task
public boolean ready = false; // daca s-a terminat complet rezolvarea problemei
LinkedList<Task> tasks = new LinkedList<Task>();
/**
* Constructor pentru clasa WorkPool.
* @param nThreads - numarul de thread-uri worker
*/
public WorkPool(int nThreads) {
this.nThreads = nThreads;
}
public void add(WorkPool wp) {
tasks.addAll(wp.tasks);
}
public void iterate()
{
for (Task t : tasks) {
System.out.println(t.toString());
}
}
/**
* Functie care incearca obtinera unui task din workpool.
* Daca nu sunt task-uri disponibile, functia se blocheaza pana cand
* poate fi furnizat un task sau pana cand rezolvarea problemei este complet
* terminata
* @return Un task de rezolvat, sau null daca rezolvarea problemei s-a terminat
*/
public synchronized Task getWork() {
if (tasks.size() == 0) { // workpool gol
nWaiting++;
/* condtitie de terminare:
* nu mai exista nici un task in workpool si nici un worker nu e activ
*/
if (nWaiting == nThreads) {
ready = true;
/* problema s-a terminat, anunt toti ceilalti workeri */
notifyAll();
return null;
} else {
while (!ready && tasks.size() == 0) {
try {
this.wait();
} catch(Exception e) {e.printStackTrace();}
}
if (ready)
/* s-a terminat prelucrarea */
return null;
nWaiting--;
}
}
return tasks.remove();
}
/**
* Functie care introduce un task in workpool.
* @param sp - task-ul care trebuie introdus
*/
synchronized <T extends Task> void putWork(T sp) {
//System.out.println("WorkPool - adaugare task: " + sp);
tasks.add(sp);
/* anuntam unul dintre workerii care asteptau */
this.notify();
}
}