Nun habe ich es zum Laufen gebracht.
Er gibt nur noch leider ein falsches Ergebnis aus:
1
1
2
1
2
3
...
Mein Code:
* Semaphore( int permits ) Ein neues Semaphor, das bestimmt, wie viele Threads in einem Block sein dürfen.
* void acquire() Versucht, in den kritischen Block einzutreten. Wenn der gerade belegt ist, wird gewartet. Vermindert die Menge der Erlaubnisse um eins.
* void release() Verlässt den kritischen Abschnitt und legt eine Erlaubnis zurück.
*/
public class Interprozesskommunikation_3 {
public static Semaphore sema1 = new Semaphore(1);
public static Semaphore sema2 = new Semaphore(0);
public static Semaphore sema3 = new Semaphore(0);
public static boolean aufwaerts = true;
public ThreadOne p1 = new ThreadOne();
public ThreadTwo p2 = new ThreadTwo();
public ThreadThree p3 = new ThreadThree();
public class ThreadOne extends Thread {
public ThreadOne() {
start();
}
public void run(){
try{
sema1.acquire(); // sema1--
while (true){
System.out.println("1");
this.sleep(2000);
if(aufwaerts == false){
aufwaerts = true;
sema1.release(); // sema1++
}
else{
sema2.release(); // sema2++
}
}
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
public class ThreadTwo extends Thread {
public ThreadTwo() {
start();
}
public void run(){
try{
sema2.acquire(); // sema2--
while (true){
System.out.println("2");
this.sleep(2000);
if(aufwaerts == false){
sema1.release(); // sema1++
}
else{
sema3.release(); // sema3++
}
}
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
public class ThreadThree extends Thread {
public ThreadThree() {
start();
}
public void run(){
try{
sema3.acquire(); // sema3--
while (true){
System.out.println("3");
this.sleep(2000);
aufwaerts = false;
sema2.release(); // sema2++
}
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
public static void main(String[] args){
Interprozesskommunikation_3 mySem = new Interprozesskommunikation_3();
}
}