Bearbeiten Dieser Beitrag bezieht sich auf eine Hausaufgabe, die ich für die Schule habe, die diktiert, dass ich auf Swing angewiesen bin, um meine Threads und boolesche Flags zum Blockieren anzuzeigen.
Meine Anwendung erstellt eine Reihe von "Job" -Objekten, die jeweils einen Thread enthalten. Jeder Job gehört einer Kreatur. Eine Kreatur kann mehrere Aufträge besitzen, aber sie kann immer nur einen von ihnen ausführen.
Mein Thread verwendet zwei boolesche Flags, um zu bestimmen, ob er ausgeführt werden soll oder nicht, genannt "killFlag" und "goFlag". Er bezeichnet die Kreatur, zu der er gehört, als "Ziel". Und jedes Ziel hat ein boolesches "isWorking", um anzuzeigen, ob es mit einem anderen Job beschäftigt ist oder nicht.
Dies ist der Thread, den jeder Job ausführen sollte:
%Vor% Zuerst dachte ich, es wäre target.notifyAll()
, weil es ein IllegalMonitorStateException
wirft, aber wenn ich es auszzeichne, werden die Objekte konstruiert, aber wenn ich sie in der GUI betrachte, werden 80% als komplett ohne angezeigt Jede Interaktion von mir und den anderen 20% besagt, dass die Kreatur beschäftigt ist.
Zuerst dachte ich, das wäre so, weil ich die Todesflagge zu früh aufstoße, aber wenn ich sie tiefer ziehe oder entferne, bleiben die Symptome bestehen. Ich bin im Moment im Einsatz und es gibt keine Programmierer hier, haha, jeder Rat, den du geben könntest, würde die Welt bedeuten.
Um sicherzustellen, dass ich unten genug Informationen zur Verfügung stelle, sind die Methoden, die ich für die Interaktion mit den Threads verwende. Die folgenden Methoden funktionieren mit einer Schaltfläche, die sich abhängig davon ändert, ob der Thread ausgeführt wird oder nicht.
%Vor%Das bringt mich um, ich habe herumgestöbert, um das für 6 Stunden zu lösen.
Bearbeiten
Nachdem ich meinen Code basierend auf MadProgrammer's Kommentar angepasst habe, ist "target.notifyAll ()" behoben. Nun scheint das Problem zu sein, dass alle Fäden auf dem Display als abgeschlossen erscheinen, obwohl die Knöpfe für einen Bruchteil einer Sekunde zufällig zwischen Zuständen blinken.
Bearbeiten
Viele Änderungen, die unten als Antwort auf Kommentare enthalten sind
Im Folgenden definiere ich die Jobklasse, in der killFlag, goFlag usw. definiert sind.
%Vor%Unten ist definiert, wo Creature (target) definiert ist, wo boolean isWorking residiert:
%Vor%Und als Antwort auf die Kommentare hier ist ein Bild davon, wie ich die Threads anzeigen werde:
Da noch ein Code fehlt, werde ich zuerst einige Annahmen aufzählen; Wenn irgendwelche nicht halten, kann meine Antwort unten falsch sein.
run()
, die Sie angegeben haben, befindet sich in der Klasse Job
. stopJob
JButton
Wenn Sie die gleiche Job
-Instanz für den Neustart nach dem ersten Durchlauf erneut verwenden möchten, besteht das grundlegende Problem darin, dass Ihre run()
-Methode beendet wird. Sie haben eine while
-Schleife, die nach !killFlag
sucht, aber sobald diese Schleife beendet ist (dh sobald der Job abgebrochen wurde und killFlag == true
), gibt es nichts, was dazu führen würde, dass er zum Anfang zurückkehrt und auf einen nachfolgenden% wartet co_de% state, um wieder zu starten. (Überlegen Sie auch, ob die goFlag == true
-Klausel in Ihrer stopJob
-Methode etwas mit actionPerformed()
machen muss.)
Wenn Sie andererseits eine neue goFlag
-Instanz erstellen möchten, die den neu gestarteten Job darstellt, haben Sie keinen Code angezeigt, der dies tun würde.
Ich bin absichtlich ein bisschen vage in meiner obigen Diagnose, um Ihnen zu helfen, Dinge selbst herauszufinden - das ist der beste Weg zu lernen. :) Wenn Sie mehr Details benötigen, kann ich versuchen, sie zu liefern, nur LMK in einem Kommentar.
Tags und Links java multithreading swing