
import java.io.*;

// Beispiel vom 14.11.2014
// in Thread08 sind getSumme und decSumme fehlerhaft
// man darf nur eine Methode benutzen
// Methode  gibt einen Wert UND definiert das Ende der Schleife


public class Thread09  {

   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 4 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) {
    Thread09 frame = new Thread09();
    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() {
		// System.out.println("in run summe: "+p.summe);
        int bestellung;
        bestellung=p.getPaket();  
		while (bestellung>0) {
			summe++;
            bestellung=p.getPaket();
		}
	}
}




class Paket {
	
	private int summe=0;
	
	
	public Paket(int summe) {
		this.summe=summe;
	}
	
	public synchronized int getPaket() {
		int s;
		if (summe>0) {
			s=summe;
			summe--;
		}
		else
			s=-1;		
		return s;
	}
	

}

