
import java.io.*;

// Dieses Beispiel summiert mit Threads,  jeweils  1000 Zahlen
// Ergebnis sollte 10000 sein
// Problem:  Gemeinsamer Zugriff auf die Variable summe
// Abhilfe: Klasse calcSumme
// vier Threads, diesmal mit Aufruf start
// 10 * 1,2,3,4  addieren= Summe 100
public class Thread07  {

   private static void pause() {
    try {
      System.in.read();
    }
    catch (IOException e) {
    }
  }  // pause

  private void test1() {
    MyThread t1,t2;
    MyThread t3,t4;
    CalcSumme calc ;
    calc = new CalcSumme();

    t1 = new MyThread(1,10000000, calc);
    t2 = new MyThread(2,10000000, calc);
    t3 = new MyThread(3,10000000, calc);
    t4 = new MyThread(4,10000000, calc);

    t1.start();
    t2.start();
    t3.start();
    t4.start();
    try {
      t2.join();
      t3.join();
      t1.join();
      t4.join();
    }
    catch (InterruptedException e) {
    }
    System.out.println("***************  Summe: "+calc.getSumme() ); 
  } // test1



  public static void main(String[] args) {
    Thread07 frame = new Thread07();
    frame.test1();
    pause();
  }




  // Erzeugen des Synchroniserungs-Objekt
  // nur mit Hilfe dieser Klasse wird summiert
  class CalcSumme {
    private long summe;
    public CalcSumme() {
      summe=0;
    }
      // synchronized
     public synchronized void add(long nr) {
        summe += nr;
    }
     public long getSumme() {
      return summe;
     }
  } // innere Klasse CalcSumme
  
  
  class MyThread extends Thread {
  
    long nummer=0;
    int n;
    CalcSumme calc ;
  
    public MyThread (long nr, int n, CalcSumme calc) {
       nummer = nr;
       this.n=n;
       this.calc=calc;
    }
  
  
    // lokale Summe
    public void run() {
      for (int i=0; i<n; i++) {
        this.calc.add(nummer);
        
      }
    }  // run 
  
  }  // innere Klasse MyThread
  
}


