2. Monitors
Concurrency
This commit is contained in:
28
MonitorCase1/src/Buffer.java
Normal file
28
MonitorCase1/src/Buffer.java
Normal file
@@ -0,0 +1,28 @@
|
||||
|
||||
public class Buffer {
|
||||
private char[] buffer;
|
||||
private int count = 0, in = 0, out = 0;
|
||||
|
||||
Buffer(int size) {
|
||||
buffer = new char[size];
|
||||
}
|
||||
|
||||
public synchronized void Put(char c) {
|
||||
while (count == buffer.length)
|
||||
;
|
||||
System.out.println("Producing " + c + " ...");
|
||||
buffer[in] = c;
|
||||
in = (in + 1) % buffer.length;
|
||||
count++;
|
||||
}
|
||||
|
||||
public synchronized char Get() {
|
||||
while (count == 0)
|
||||
;
|
||||
char c = buffer[out];
|
||||
out = (out + 1) % buffer.length;
|
||||
count--;
|
||||
System.out.println("Consuming " + c + " ...");
|
||||
return c;
|
||||
}
|
||||
}
|
||||
19
MonitorCase1/src/PC.java
Normal file
19
MonitorCase1/src/PC.java
Normal file
@@ -0,0 +1,19 @@
|
||||
/*
|
||||
* Run this code.
|
||||
* 1: What happens ?
|
||||
* 2: Why does it happen ?
|
||||
*
|
||||
* Code courtesy of www.csc.villanova.edu/~mdamian/threads/javamonitors.html
|
||||
*/
|
||||
public class PC {
|
||||
|
||||
public static void main(String[] args) {
|
||||
Buffer b = new Buffer(4);
|
||||
Producer p = new Producer(b);
|
||||
Consumer c = new Consumer(b);
|
||||
|
||||
p.start();
|
||||
c.start();
|
||||
}
|
||||
|
||||
}
|
||||
27
MonitorCase1/src/ProCon.java
Normal file
27
MonitorCase1/src/ProCon.java
Normal file
@@ -0,0 +1,27 @@
|
||||
class Producer extends Thread {
|
||||
private Buffer buffer;
|
||||
|
||||
Producer(Buffer b) {
|
||||
buffer = b;
|
||||
}
|
||||
|
||||
public void run() {
|
||||
for (int i = 0; i < 10; i++) {
|
||||
buffer.Put((char) ('A' + i % 26));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
class Consumer extends Thread {
|
||||
private Buffer buffer;
|
||||
|
||||
Consumer(Buffer b) {
|
||||
buffer = b;
|
||||
}
|
||||
|
||||
public void run() {
|
||||
for (int i = 0; i < 10; i++) {
|
||||
buffer.Get();
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user