Java Tutorial/Thread/Thread Buffer

Материал из Java эксперт
Перейти к: навигация, поиск

Two threads manipulating an unsynchronized buffer

   <source lang="java">

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

}</source>



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