Android - Thread.join() bewirkt, dass die Anwendung hängen bleibt
Ich habe einen thread, der behandelt meine Spiel-Schleife, wenn ich rufe .join() auf diesen thread reagiert die Anwendung.
Ich habe versucht ein problem zu lösen, wo die Programme, die Sie nie bekommen, um den code, I. E der thread nie enden.
System.out.println("YAY");
Meinem Thread für den gameloop:
Dieser thread erfolgreich druckt "Spiel Beendet", aber scheint nie fertig zu stellen.
Runnable startGameLoop = new Runnable() {//game loop
@Override
public void run() {
AiFactory ai = new AiFactory();
final Button play = (Button) findViewById(R.id.Play);
final Button pass = (Button) findViewById(R.id.Pass);
while(finish==false){
try {
Thread.sleep(500);
} catch (InterruptedException e) {
e.printStackTrace();
}
currentPlayer = game.getPlayer();
if(currentPlayer.isPlayer()==false){
//System.out.println("passCount:" +game.getPasscount());
ai.decide(nextPlay, game.getPreviousPlayed(), currentPlayer, game.getPasscount() );
if(nextPlay.size()!=0){
runOnUiThread(new Runnable(){
public void run(){
changeArrow();
if(nextPlay.size() ==1){
play1Card();
}
else if(nextPlay.size()==2){
play2Card();
}
else if(nextPlay.size()==3){
play3Card();
}
else if(nextPlay.size()==5){
play5Card();
}
}
}
else{
game.addPassCount();
game.nextTurn();
runOnUiThread(new Runnable(){
public void run(){
changeArrow();
}
});
}
}
else if (currentPlayer.isPlayer()==true){
runOnUiThread(new Runnable(){
public void run(){
changeArrow();
play.setClickable(true);
if(game.getPasscount()==3){
pass.setClickable(false);
}
else{
pass.setClickable(true);
}
}
});
}
}
System.out.println("Game Ended");
}
};
Starten und verbinden der Gewinde an den Haupt-thread:
Thread myThread = new Thread(startGameLoop);
myThread.start();
try {
myThread.join();
} catch (InterruptedException e) {
//TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println("YAY");
}
Meinem Verständnis .der join() Methode lässt den aktuellen thread warten, bis der neue thread beendet ist, bevor Sie weitermachen.
Sorry wenn dies eine dumme Frage, ich bin ziemlich neu einfädeln.
- Wir brauchen ein wenig mehr Kontext. Woher kommt dieser Ruf zu
join()
auftreten. Wahrscheinlich sind Sie dies zu tun auf dem UI-thread, das würde erklären, warum die app hängt sich auf. - join erfolgt in der onCreate() in einer Activity-Klasse
- Damit Ihre app wartet auf einen thread zu beenden, bevor es endet erstellen der Aktivität. Ist das wirklich das, was Sie tun wollen? Wenn nicht, was wollen Sie hier tun?
- Ah, das war der 2 Teil mein Fehler. Ich eingefügt interrupts zu Ende mein thread und es war auch, weil ich war die Blockierung der UI-thread mit dem Mitmach-Aufruf. Vielen Dank für das heads-up, Jungs.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Beim Aufruf
myThread.join()
innenActivity.onCreate
Sie blockieren die Haupt-UI-thread. Natürlich es sieht aus wie Ihre Anwendung nicht mehr reagiert, weil der UI-thread ist der verantwortliche für das Neuzeichnen UI. Alle Ihre AnruferunOnUiThread
nie passieren, weil dein UI-thread beschäftigt ist warten auf Ihr Spiel-Schleife.Thread.join lässt den aktuellen thread warten, bis der Faden, den Sie benennen es endet. Es bewirkt nicht, dass der thread Sie es nennen, zu Ende. Also, wenn dieser thread wird nie enden (Sie sagen an der Spitze), den Aufruf join machen es immer hängen.
Wenn Sie wollen, um tatsächlich zu Ende der thread, rufen Sie Abbrechen auf. Aber das erfordert deinen thread gelegentlich isCanceled () - und exit-seine run-Funktion, wenn es den Wert true zurück.
mythread.join() garantiert nicht, dass Ihre "mythread" beendet.
Müssen Sie durch ein notify() in der game loop.
...
...
Grundsätzlich, wenn Sie einen Anruf zu warten(), der code wartet auf den thread überwachen, und ein Aufruf von notify() bewirkt, dass ein thread wartet auf das Objekt zu überwachen, um aufzuwachen.
Sie können auch verwenden, notifyAll() zum aufwecken aller wartenden threads.
Alternativ können Sie die timeout-version von wait(), wo der thread wartet entweder, bis er informiert wird, oder es mal aus.
Lock
mitCondition
besser erreichen dieses