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