Ich versuche, die grundlegende jist eines Semaphor in der Dining Philosopher Problem zu lernen. Gerade jetzt, ich habe eine Reihe von Klasse Ess-Stäbchen, und jeder Chopstick hat eine Semaphore mit 1 verfügbar Erlaubnis:Semaphore Probleme in Java mit den Dining Philosophen
public class Chopstick
{
Thread holder = null;
private Semaphore lock = new Semaphore(1);
public synchronized void take() throws InterruptedException
{
this.lock.acquire();
holder = Thread.currentThread();
}
public synchronized void release()
{
this.lock.release();
holder = null;
}
}
Der Halter Variable für eine Funktion verwendet wird, die ich bin nicht sicher, ich brauche:
public synchronized void conditionalRelease()
{
if (holder == Thread.currentThread())
{
holder = null;
this.lock.release();
}
}
Das Programm kompiliert und läuft, scheint aber Probleme mit der Freigabe der Essstäbchen zu haben. Manchmal werden die Essstäbchen freigegeben, manchmal nicht. Wenn sie nicht loslassen, hängt das Programm schließlich auf, wenn alle Essstäbchen genommen sind und ein Philosoph hungrig ist.
Hier ist der Code innerhalb der Tutor-Klasse der Ess-Stäbchen nach unbestimmter Zeit zu lösen:
System.out.println(this.name + " is eating");
Thread.sleep(this.getRandTime());
System.out.println(this.name + " has finished eating");
rightChopstick.release();
System.out.println(this.name + " has released the right chopstick");
leftChopstick.release();
System.out.println(this.name + " has released the left chopstick");
Mein Programm funktioniert Ausgang „Tutor 0 hat Essen fertig“, zum Beispiel, und setzt die Ausführung. Die anderen beiden Zeilen geben niemals aus, also ist offensichtlich etwas nicht in Ordnung mit der Art, wie ich loslasse.
Jede Hilfe wird geschätzt.
Ha! Das war genau das, was es war ... Ich musste diese zwei verschiedenen Wege für eine Aufgabe implementieren und habe Code für die erste Methode kopiert und vergessen, das synchronisierte Schlüsselwort zu entfernen. Netter Fund. –