Java tutorial
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."); } }