Semaphore

Status
Nicht offen für weitere Antworten.

nameac

Bekanntes Mitglied
hallo,

Code:
public class Semafore {

	int anzahl;

	Semafore(int anzahl) {
		this.anzahl = anzahl;
	}

	public synchronized void acquire() {
		while (anzahl <= 0) {
			System.out.println("3 threads in ausführung");
			try {
				this.wait();
			} catch (InterruptedException e) {

			}
		}
                                anzahl--;
	}

	public synchronized void release() {
		anzahl++;
		this.notify();
	}

das ganze soll bewirken das nur eine bestimmte anzahl an threads auf einen bereich durchlaufen können alle müssen warten.

//Threads kommen
Code:
workerA.semafore.acquire();
brerechnungen...
workerB.semafore.release();

warum kann man für die while schleife nicht auch if setzen?

das notify setzt den nächsten thread in gang der am warten war oder?

[Edit by Beni: Verschoben, das hat nichts mit AWT oder Swing zu tun. Codetags ergänzt.]
 
G

Gast

Gast
das notify setzt den nächsten thread in gang der am warten war oder?

Nein. In der Klasse Object wo das notify herkomme gibt es keine queue. Bei dir setzt er den Thread der die Funktion aufruft wieder in den "laufen" Modus. Du kannst aber alle Threads mit notifyAll aufwecken und dir dann den Thread aussuchen der weiterlaufen soll. Und die anderen legst du wieder Schlafen. Besser währe es wenn du da eine queue implementierst.
 

nameac

Bekanntes Mitglied
und warum sezt an dann den wartenden thread in ne while schleife in der er gestoppt wird wie soll der denn da wieder raus kommen mit notify der kann doch nicht stoppen und dann seine eigene notify methode abarbeiten?

wie funktioniert denn diese semaphore?
 
B

Beni

Gast
Ein Thread kann sich mit "wait" selbst schlafen legen. Er hört dann das Objekt ab, auf dem er "wait" aufgerufen hat, und wartet solange, bis ein anderer Thread "notify" oder "notifyAll" aufruft. Im ersten Fall wird zufällig ein wartender Thread geweckt, im anderen Fall alle wartenden Threads zusammen.

Also für mich sieht der Code richtig aus. Die Schleife wird wohl zur Sicherheit verwendet, falls ein Thread mal nicht wegen einem "notify" aufwacht, sondern weil jemand "interrupt" auf ihn anwendet (deshalb gibt es auch den try-catch-Block mit der InterruptedException).
 

nameac

Bekanntes Mitglied
also stimmt es das notify immer einen ruhenden thread aus einer z.B. "queue", indem fall is das halt sone art threadpool in dem alle schlafenden threads warten, weckt und nicht das Objekt das ihm zur ausführung übergeben wurde.
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen

Ähnliche Java Themen

Neue Themen


Oben