© Wipro Technologies Talent Transformation Java Programming v2.1Page 1 Java Programming.
Java Producer-Consumer Monitor From: Concurrent Programming: The Java Programming Language By Steven...
-
Upload
randall-strickland -
Category
Documents
-
view
214 -
download
0
Transcript of Java Producer-Consumer Monitor From: Concurrent Programming: The Java Programming Language By Steven...
![Page 1: Java Producer-Consumer Monitor From: Concurrent Programming: The Java Programming Language By Steven J. Hartley Oxford University Press, 1998.](https://reader036.fdocuments.in/reader036/viewer/2022082821/5697c0151a28abf838ccddce/html5/thumbnails/1.jpg)
Java Producer-Consumer Monitor
From:
Concurrent Programming: The Java Programming Language
By Steven J. Hartley
Oxford University Press , 1998
![Page 2: Java Producer-Consumer Monitor From: Concurrent Programming: The Java Programming Language By Steven J. Hartley Oxford University Press, 1998.](https://reader036.fdocuments.in/reader036/viewer/2022082821/5697c0151a28abf838ccddce/html5/thumbnails/2.jpg)
Declare The Monitor (A Class)
class BoundedBuffer {
![Page 3: Java Producer-Consumer Monitor From: Concurrent Programming: The Java Programming Language By Steven J. Hartley Oxford University Press, 1998.](https://reader036.fdocuments.in/reader036/viewer/2022082821/5697c0151a28abf838ccddce/html5/thumbnails/3.jpg)
Shared Data
// designed for a single producer thread
// and a single consumer thread
private int numSlots = 0;
private double[] buffer = null;
private int putIn = 0, takeOut = 0;
private int count = 0;
![Page 4: Java Producer-Consumer Monitor From: Concurrent Programming: The Java Programming Language By Steven J. Hartley Oxford University Press, 1998.](https://reader036.fdocuments.in/reader036/viewer/2022082821/5697c0151a28abf838ccddce/html5/thumbnails/4.jpg)
public BoundedBuffer(int numSlots) {
if (numSlots <= 0) throw new IllegalArgumentException("numSlots<=0");
this.numSlots = numSlots;
buffer = new double[numSlots];
System.out.println("BoundedBuffer alive, numSlots=" + numSlots);
}
Initializer Entry Method
![Page 5: Java Producer-Consumer Monitor From: Concurrent Programming: The Java Programming Language By Steven J. Hartley Oxford University Press, 1998.](https://reader036.fdocuments.in/reader036/viewer/2022082821/5697c0151a28abf838ccddce/html5/thumbnails/5.jpg)
Producer Entry Method
public synchronized void deposit(double value) {
while (count == numSlots)
try {
wait();
} catch (InterruptedException e) {
System.err.println("interrupted out of wait");
}
buffer[putIn] = value;
putIn = (putIn + 1) % numSlots;
count++; // wake up the consumer
if (count == 1) notify(); // since it might be waiting
System.out.println(" after deposit, count=" + count
+ ", putIn=" + putIn);
}
![Page 6: Java Producer-Consumer Monitor From: Concurrent Programming: The Java Programming Language By Steven J. Hartley Oxford University Press, 1998.](https://reader036.fdocuments.in/reader036/viewer/2022082821/5697c0151a28abf838ccddce/html5/thumbnails/6.jpg)
Consumer Entry Method
public synchronized double fetch() {
double value;
while (count == 0)
try {
wait();
} catch (InterruptedException e) {
System.err.println("interrupted out of wait");
}
value = buffer[takeOut];
takeOut = (takeOut + 1) % numSlots;
count--; // wake up the producer
if (count == numSlots-1) notify(); // since it might be waiting
System.out.println(" after fetch, count=" + count
+ ", takeOut=" + takeOut);
return value;
}
![Page 7: Java Producer-Consumer Monitor From: Concurrent Programming: The Java Programming Language By Steven J. Hartley Oxford University Press, 1998.](https://reader036.fdocuments.in/reader036/viewer/2022082821/5697c0151a28abf838ccddce/html5/thumbnails/7.jpg)
End The Monitor Declaration
} // End the class (just like any other)
![Page 8: Java Producer-Consumer Monitor From: Concurrent Programming: The Java Programming Language By Steven J. Hartley Oxford University Press, 1998.](https://reader036.fdocuments.in/reader036/viewer/2022082821/5697c0151a28abf838ccddce/html5/thumbnails/8.jpg)
Java Fair Reader-Writer Monitor
From:
Concurrent Programming: The Java Programming Language
By Steven J. Hartley
Oxford University Press , 1998
![Page 9: Java Producer-Consumer Monitor From: Concurrent Programming: The Java Programming Language By Steven J. Hartley Oxford University Press, 1998.](https://reader036.fdocuments.in/reader036/viewer/2022082821/5697c0151a28abf838ccddce/html5/thumbnails/9.jpg)
Declare The Monitor (A Class)
class Database extends MyObject {
![Page 10: Java Producer-Consumer Monitor From: Concurrent Programming: The Java Programming Language By Steven J. Hartley Oxford University Press, 1998.](https://reader036.fdocuments.in/reader036/viewer/2022082821/5697c0151a28abf838ccddce/html5/thumbnails/10.jpg)
Shared Data
private int numReaders = 0;
private int numWriters = 0;
private int numWaitingReaders = 0;
private int numWaitingWriters = 0;
private boolean okToWrite = true;
private long startWaitingReadersTime = 0;
![Page 11: Java Producer-Consumer Monitor From: Concurrent Programming: The Java Programming Language By Steven J. Hartley Oxford University Press, 1998.](https://reader036.fdocuments.in/reader036/viewer/2022082821/5697c0151a28abf838ccddce/html5/thumbnails/11.jpg)
public Database() { super("rwDB"); } // Call the parent class’s constructor
Initializer Entry Method
![Page 12: Java Producer-Consumer Monitor From: Concurrent Programming: The Java Programming Language By Steven J. Hartley Oxford University Press, 1998.](https://reader036.fdocuments.in/reader036/viewer/2022082821/5697c0151a28abf838ccddce/html5/thumbnails/12.jpg)
startRead Entry Method
public synchronized void startRead(int i) {
long readerArrivalTime = 0;
if (numWaitingWriters > 0 || numWriters > 0) {
numWaitingReaders++;
readerArrivalTime = age();
while (readerArrivalTime >= startWaitingReadersTime)
try {wait();} catch (InterruptedException e) {}
numWaitingReaders--;
}
numReaders++;
}
![Page 13: Java Producer-Consumer Monitor From: Concurrent Programming: The Java Programming Language By Steven J. Hartley Oxford University Press, 1998.](https://reader036.fdocuments.in/reader036/viewer/2022082821/5697c0151a28abf838ccddce/html5/thumbnails/13.jpg)
endRead Entry Method
public synchronized void endRead(int i) {
numReaders--;
okToWrite = numReaders == 0;
if (okToWrite) notifyAll();
}
![Page 14: Java Producer-Consumer Monitor From: Concurrent Programming: The Java Programming Language By Steven J. Hartley Oxford University Press, 1998.](https://reader036.fdocuments.in/reader036/viewer/2022082821/5697c0151a28abf838ccddce/html5/thumbnails/14.jpg)
startWrite Entry Method
public synchronized void startWrite(int i) {
if (numReaders > 0 || numWriters > 0) {
numWaitingWriters++;
okToWrite = false;
while (!okToWrite)
try {wait();} catch (InterruptedException e) {}
numWaitingWriters--;
}
okToWrite = false;
numWriters++;
}
![Page 15: Java Producer-Consumer Monitor From: Concurrent Programming: The Java Programming Language By Steven J. Hartley Oxford University Press, 1998.](https://reader036.fdocuments.in/reader036/viewer/2022082821/5697c0151a28abf838ccddce/html5/thumbnails/15.jpg)
endWrite Entry Method
public synchronized void endWrite(int i) {
numWriters--; // ASSERT(numWriters==0)
okToWrite = numWaitingReaders == 0;
startWaitingReadersTime = age();
notifyAll();
}
![Page 16: Java Producer-Consumer Monitor From: Concurrent Programming: The Java Programming Language By Steven J. Hartley Oxford University Press, 1998.](https://reader036.fdocuments.in/reader036/viewer/2022082821/5697c0151a28abf838ccddce/html5/thumbnails/16.jpg)
End The Monitor Declaration
} // End the class (just like any other)