Thread.join() und Thread.interrupt() hört nicht auf den thread
Ich habe einige Probleme mit stoppen meine threads.
Ich habe versucht, Sie anzurufen, beide Thread.join()
und Thread.interrupt()
, allein und zusammen, aber ich kann Sie nicht arbeiten.
Ich habe eine while
Schleife in jeder Klasse, die ausgeführt wird, solange eine Boolesche genannt running
gleich true
.
Ich habe dann beenden Sie das Programm durch den Aufruf einer Methode namens stop
. Die stop
Methode stellt nur running
auf false, so dass die while-Schleife beendet.
BEARBEITEN Code:
public class Game implements Runnable {
//The Thread
private Thread thread;
//The program's running state
private boolean running = false;
//Create the Thread and the rest of the application
public void create() {
//Create the Thread
thread = new Thread(this, "Game");
//Start the Thread
thread.start();
//Set the program's running state to true
running = true;
}
public void run() {
while(running) {
//Render, update etc...
}
//When the while loop has exited
//(when running is false (when the stop method has been called))
try {
//Join the thread
thread.join();
//Interrupt the thread
thread.interrupt();
} catch(InterruptedException e) {
//Print the exception message
e.printStackTrace();
}
//Exit the program
System.exit(0);
}
//Stop the game
public void stop() {
//Set the program's running state to false
running = false;
}
//The main method
public static void main(String[] args) {
//Create a new instance of Game and start it
new Game().create();
}
Nicht genug code. Beachten Sie, dass der standard-Weg, um zu überprüfen, ob ein thread unterbrochen wird, ist zu prüfen, für
Sorry, ich habe nicht erwähnt, ich bin creaing ein Spiel, also nicht für die Verwendung von threads ist nicht eine option. Auch, wie viel code brauchen Sie?
Glaubst du wirklich, dass join() und interrupt() setzt deine
Das ist die Basis. Ich habe alle rendering etc. innerhalb der Schleife.
Thread.currentThread().isInterrupted()
. Lesen Sie die javadoc gezielt. Oder noch besser, verwenden Sie keine threads direkt und verwenden Sie ein ExecutorService
. Und kaufen JCIP.Sorry, ich habe nicht erwähnt, ich bin creaing ein Spiel, also nicht für die Verwendung von threads ist nicht eine option. Auch, wie viel code brauchen Sie?
Glaubst du wirklich, dass join() und interrupt() setzt deine
running
variable auf false? Ist es das, was die javadoc dieser Methoden behaupten?Das ist die Basis. Ich habe alle rendering etc. innerhalb der Schleife.
AtomicBoolean
bringt nichts auf die Tabelle über volatile
wenn alles, was Sie nennen würde, ist es set
und get
.InformationsquelleAutor Daniel Kvist | 2014-12-14
Du musst angemeldet sein, um einen Kommentar abzugeben.
Der thread blockiert sich
Ein thread endet, wenn die run-Methode fertig ist, aber Sie rufen die
join()
- Methode innerhalb derrun()
Methode, und diese Methode wartet solange, bis der thread fertig ist. Also dierun()
- Methode wird nie enden und der thread wird niemals sterben.Sie haben richtig gemacht, zu implementieren, während die tests, die ein boolean-Sie können in einer Methode, die zum beenden des thread.
Zu Ende der thread und wartet auf sein Ende, rufen Sie die
join()
Methode nach dem Aufruf derstop()
.Die
System.exit(0)
in der run-Methode ist nicht erforderlich. Wenn dein thread endet und der join () - Methode gibt, die main-Methode endet und so das Programm ist fertig.Ich weiß, Ihr wirkliches Programm wird komplexer sein, aber Sie brauchen nichtSystem.exit()
.EDIT 1:
thread.join()
imrun()
Methode?Ja, das bewirkt, dass der thread warten, bis die Ende-aber das wird nie passieren. Wenn Sie die interrupt () - Methode, die join () - Methode zu Ende sein würde und auch der thread. Aber Sie müssen den Anruf zu unterbrechen, die von außerhalb der run-Methode. Aber es gibt keine Notwendigkeit zu tun, anyhing nach der wile.
So sollte ich mich nennen die
thread.interrupt()
und dannthread.join()
immain
oderstop
- Methode, und legen Sierunning
auf false, um den Faden, und das Spiel stoppen?Ja, schauen Sie sich in EDIT1 und es versuchen.
Sieht gut aus! Ich werde versuchen, es so bald wie möglich.
InformationsquelleAutor Gren
Ich glaube, Sie sollten schreiben Sie Ihre run () - Methode:
Und Ihre stop () - Methode, Sie einfach zu unterbrechen, den thread sollte es tun:
Fügen Sie ein join () - Methode:
So, in Ihrem Haupt, dem Sie beitreten, dein thread
Dies ist die Verwandte JavaDoc.
Was ist mir nicht klar, noch, wie genau du aufrufen der stop().
JFrame
geschlossen wird.Ich werde es versuchen, wenn auf meinem PC.
InformationsquelleAutor parakmiakos
Soweit ich verstehe, Sie müssen aufhören, alle Ihre threads, wenn Ihr Spiel beendet main.
Sie können setDaemon(true), um alle Ihre threads und Sie werden automatisch geschlossen.
Lesen über setDaemon in der Dokumentation
http://docs.oracle.com/javase/7/docs/api/java/lang/Thread.html#setDaemon(boolean)
Aus der Dokumentation: Die Java Virtual Machine beendet wird, wenn nur die threads sind alle daemon threads. Also, es heißt, wenn Sie nur daemon-threads in Ihre Anwendung, Anwendungen werden geschlossen. Und alle threads werden auch geschlossen werden.
InformationsquelleAutor Vitaly