Java Tutorial/Thread/Thread Buffer

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

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



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