
import java.io.*;

// Beispiel vom 14.11.2014
// getSumme und decSumme sind zwar synchronized, aber durch die Pause
//   zwischen den Aufrufen kann es schiefgehen

// Thread09 ist besser

public class Thread08  {

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

	private void test1() {
		System.out.println("in test1");
		Paket p = new Paket(1000000);
		
        MyThread [] mt = new MyThread[8]; // Regal mit 8 leeren Fächern
        for (int i=0; i<mt.length; i++) {
			mt[i] = new MyThread(p);
		}
		
		for (int i=0; i<mt.length; i++) {
			mt[i].start();
		}
		try {
			for (int i=0; i<mt.length; i++) {
				mt[i].join();
			}
			
		}
		catch (InterruptedException e) {}
		
		int summe=0;
		for (int i=0; i<mt.length; i++) {
			summe += mt[i].getSumme();
		}
		System.out.println("summe: "+summe);
		
	}


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


class MyThread extends Thread{
	
	private Paket p;
	private int summe=0;
	
	public int getSumme() {
		return summe;
	}
	
	public MyThread(Paket p) {
		this.p=p;
	}
	
 	public void run() {
		while (p.getSumme()>0) {
            for (int i=0; i<100; i++) {
              for (int j=0; j<100; j++) {
                 Math.sin(100);
              }
            }
            summe++;
            p.decSumme();
		}
	}
}

class Paket {
	
	private int summe=0;
	
	public Paket(int summe) {
		this.summe=summe;
	}
	
	public synchronized int getSumme() {
		return  summe;
	}
	public synchronized void decSumme() {
			summe--;
	}
	

}

