forked from Java2ArkTS/Java2ArkTS
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathReadCompute.java
More file actions
133 lines (116 loc) · 3.31 KB
/
Copy pathReadCompute.java
File metadata and controls
133 lines (116 loc) · 3.31 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
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
/*
* There are three processes P, P1, and P2 that cooperate to process the data,
* and P reads the data from the input device into the buffer,
* which can store 1000 words.
* The function of P1 and P2 is the same,
* both take the data from the buffer and calculate it, and then print the result.
* Synchronize three processes.
*/
public class ReadCompute {
public static void main(String[] args) {
Semaphores semaphores = new Semaphores();
Thread p = new Thread(new P(semaphores));
Thread p1 = new Thread(new P1(semaphores));
Thread p2 = new Thread(new P2(semaphores));
p.start();
p1.start();
p2.start();
}
}
class Semaphores {
public boolean mutex = true;
public int full = 0;
public int empty = 50;
public synchronized boolean pMutex() {
if (mutex) {
mutex = false;
return true;
} else {
return false;
}
}
public synchronized boolean pFull() {
if (full > 0) {
full--;
return true;
} else {
return false;
}
}
public synchronized boolean pEmpty() {
if (empty > 0) {
empty--;
return true;
} else {
return false;
}
}
public synchronized void vMutex() {
mutex = true;
}
public synchronized void vFull() {
full++;
}
public synchronized void vEmpty() {
empty++;
}
}
class P implements Runnable {
public Semaphores semaphores;
public P(Semaphores semaphores) {
this.semaphores = semaphores;
}
public void run() {
while (true) {
while (!semaphores.pEmpty()) {
}
while (!semaphores.pMutex()) {
}
System.out.println("P reads data from device into the buffer.");
semaphores.vMutex();
semaphores.vFull();
}
}
}
class P1 implements Runnable {
public Semaphores semaphores;
public P1(Semaphores semaphores) {
this.semaphores = semaphores;
}
public void run() {
while (true) {
while (!semaphores.pFull()) {
}
System.out.println("P1 gets one data from the buffer.");
while (!semaphores.pFull()) {
}
System.out.println("P1 gets one data from the buffer.");
System.out.println("P1 computes the datas.");
semaphores.vEmpty();
System.out.println("P1 prints the result.");
semaphores.vEmpty();
System.out.println("P1 prints the result.");
}
}
}
class P2 implements Runnable {
public Semaphores semaphores;
public P2(Semaphores semaphores) {
this.semaphores = semaphores;
}
public void run() {
while (true) {
while (!semaphores.pFull()) {
}
System.out.println("P2 gets one data from the buffer.");
while (!semaphores.pFull()) {
}
System.out.println("P2 gets one data from the buffer.");
System.out.println("P2 computes the datas.");
semaphores.vEmpty();
System.out.println("P2 prints the result.");
semaphores.vEmpty();
System.out.println("P2 prints the result.");
}
}
}