Semaphoren

Status
Nicht offen für weitere Antworten.

Marco13

Top Contributor
Ohne den (unformatierten) Code gelesen oder nachvollzogen zu haben: "IllegalMonitorStateException: current thread not owner" kommt dann, wenn man 'wait' aufruft, aber nicht auf das jeweilige Objekt synchronisiert ist
Code:
synchronized (einObjekt)
{
    einObjekt.wait(); // OK
    einAnderesObjekt.wait(); // NICHT OK
}
einObjekt.wait(); // Nicht OK
 
G

Guest

Gast
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();
}
}
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen

Ähnliche Java Themen

Neue Themen


Oben