-
Notifications
You must be signed in to change notification settings - Fork 5
/
MacauCardTournament.java
141 lines (104 loc) · 3.62 KB
/
MacauCardTournament.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
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
import java.util.HashSet;
import java.util.concurrent.Semaphore;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;
class Semafori {
public static int zeleniCounter = 0;
public static Semaphore crevni = new Semaphore(2);
public static Semaphore zeleni = new Semaphore(2);
public static Semaphore crvenHere = new Semaphore(0);
public static Semaphore ready = new Semaphore(0);
public static Lock lock = new ReentrantLock();
}
class GreenPlayer extends Thread {
public void execute() throws InterruptedException {
Semafori.zeleni.acquire();
System.out.println("Green player ready");
Thread.sleep(50);
System.out.println("Green player here");
Semafori.lock.lock();
Semafori.zeleniCounter++;
boolean komandant = (Semafori.zeleniCounter == 1);
Semafori.lock.unlock();
for(int i=1; i<=3; i++) {
if(komandant) {
Semafori.crvenHere.acquire(2);
Semafori.ready.release(4);
}
Semafori.ready.acquire();
// TODO: the following code should be executed 3 times
System.out.println("Game " + i + " started");
Thread.sleep(200);
System.out.println("Green player finished game " + i);
// if(komandant) {
// // TODO: only one player calls the next line per game
// System.out.println("Game " + i + " finished");
// }
}
if(komandant) {
Semafori.zeleni.release(2);
Semafori.crevni.release(2);
Semafori.zeleniCounter = 0;
// TODO: only one player calls the next line per match
System.out.println("Match finished");
}
}
@Override
public void run() {
try {
execute();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
class RedPlayer extends Thread {
public void execute() throws InterruptedException {
Semafori.crevni.acquire();
System.out.println("Red player ready");
Thread.sleep(50);
System.out.println("Red player here");
for(int i=1; i<=3; i++) {
Semafori.crvenHere.release();
Semafori.ready.acquire();
// TODO: the following code should be executed 3 times
System.out.println("Game "+ i +" started");
Thread.sleep(200);
System.out.println("Red player finished game "+ i);
}
}
@Override
public void run() {
try {
execute();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
public class MacauCardTournament {
public static void main(String[] args) throws InterruptedException {
HashSet<Thread> threads = new HashSet<Thread>();
for (int i = 0; i < 30; i++) {
RedPlayer red = new RedPlayer();
threads.add(red);
GreenPlayer green = new GreenPlayer();
threads.add(green);
}
// start 30 red and 30 green players in background
for(Thread t : threads) {
t.start();
}
// after all of them are started, wait each of them to finish for 1_000 ms
for(Thread t : threads) {
t.join(1000);
}
// after the waiting for each of the players is done, check the one that are not finished and terminate them
for(Thread t : threads) {
if(t.isAlive()) {
System.err.println("Possible deadlock");
t.interrupt();
}
}
}
}