import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
public class MainClass {
public static void main(String[] args) {
ExecutorService application = Executors.newFixedThreadPool(2);
Buffer sharedLocation = new UnsynchronizedBuffer();
System.out.println("Action\t\tValue\tProduced\tConsumed");
System.out.println("------\t\t-----\t--------\t--------\n");
try {
application.execute(new Producer(sharedLocation));
application.execute(new Consumer(sharedLocation));
} catch (Exception exception) {
exception.printStackTrace();
}
application.shutdown(); // terminate application when threads end
} // end main
}
interface Buffer {
public void set(int value);
public int get();
}
// UnsynchronizedBuffer represents a single shared integer.
class UnsynchronizedBuffer implements Buffer {
private int buffer = -1; // shared by producer and consumer threads
public void set(int value) {
System.out.printf("Producer writes\t%2d", value);
buffer = value;
}
public int get() {
System.out.printf("Consumer reads\t%2d", buffer);
return buffer;
}
}
class Producer implements Runnable {
private Buffer buffer; // reference to shared object
public Producer(Buffer shared) {
buffer = shared;
}
public void run() {
int sum = 0;
for (int i = 1; i <= 10; i++) {
try
{
Thread.sleep(1000);
buffer.set(i);
sum += i;
System.out.printf("\t%2d\n", sum);
} catch (InterruptedException exception) {
exception.printStackTrace();
}
}
System.out.printf("\n%s\n%s\n", "Producer done producing.", "Terminating Producer.");
}
}
class Consumer implements Runnable {
private Buffer buffer;
public Consumer(Buffer shared) {
buffer = shared;
}
public void run() {
int sum = 0;
for (int i = 1; i <= 10; i++) {
try {
Thread.sleep(1000);
sum += buffer.get();
System.out.printf("\t\t\t%2d\n", sum);
} catch (InterruptedException exception) {
exception.printStackTrace();
}
}
System.out.printf("\n%s %d.\n%s\n", "Consumer read values totaling", sum,
"Terminating Consumer.");
}
}
|