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.");
}
}
Action Value Produced Consumed
------ ----- -------- --------
Producer writes 1Consumer reads -1 1
1
Consumer reads 1Producer writes 2 2
3
Consumer reads 2 4
Producer writes 3 6
Consumer reads 3 7
Producer writes 4 10
Consumer reads 4 11
Producer writes 5 15
Consumer reads 5 16
Producer writes 6 21
10.14.Thread Buffer |
| 10.14.1. | Two threads manipulating an unsynchronized buffer |