Mega Code Archive

 
Categories / Java Tutorial / Thread
 

Two threads manipulating an unsynchronized buffer

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.");   } } ActionValueProducedConsumed --------------------------- 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 410 Consumer reads 411 Producer writes 515 Consumer reads 516 Producer writes 621