Android- Thread.join () hace que la aplicación se bloquee
Tengo un hilo que maneja mi bucle de juego, cuando llamo .join () en este hilo la aplicación deja de responder. He estado tratando de arreglar un problema donde los programas nunca llegan al código, IE el hilo nunca termina.
System.out.println("YAY");
Mi hilo para el bucle del juego:
- Cómo llamar a otra actividad después de cierto límite de tiempo
- ¿Cómo funciona el multi-threading en Android?
- Java.util.concurrent.RejectedExecutionException en Async Tarea Android
- RxAndroid: cambios de interfaz de usuario en el subproceso Schedulers.io ()
- ¿Es legal llamar al método de inicio dos veces en el mismo hilo?
Este hilo imprime con éxito "Game Ended" pero nunca parece terminar.
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"); } };
Inicio y unión del hilo al hilo principal:
Thread myThread = new Thread(startGameLoop); myThread.start(); try { myThread.join(); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } System.out.println("YAY"); }
A mi entender .join () hace que el hilo de rosca actual espere hasta que el nuevo hilo haya terminado antes de continuar.
Lo siento si esto es una pregunta estúpida, soy bastante nuevo en el roscado.
- diferencia runable androide
- Nuevo Runnable () pero no nuevo hilo?
- Cómo comprobar si se ejecuta en el hilo de la interfaz de usuario en Android?
- Cómo ejecutar subprocesos en paralelo en Android
- Cómo usar notificar y esperar
- Es posible detener un subproceso que se está conectando a URL con httpConnection.connect ()?
- Cómo matar un hilo en Android?
- Android, cuando debo usar syncronized en un hilo
Cuando llama a myThread.join()
dentro de Activity.onCreate
bloquea el subproceso principal de UI. Por supuesto, parece que su aplicación deja de responder porque el subproceso de interfaz de usuario es el responsable de volver a dibujar la interfaz de usuario (duh). Todas sus llamadas runOnUiThread
nunca suceden porque su hilo de interfaz de usuario está ocupado esperando en su bucle de juego.
Thread.join hace que el subproceso actual espere hasta que termine el subproceso en el que lo llama. No hace que el hilo al que lo llame termine. Así que si ese hilo no termina nunca (como usted dice en la parte superior), llamar a join hará que cuelgue para siempre.
Si realmente quieres terminar el hilo, cancela la cancelación. Pero eso requiere que su hilo de vez en cuando llame isCanceled () y salga de su función run si devuelve true.
Mythread.join () no se asegura de que su "mythread" se termine.
Debe colocar un notify () en su bucle de juego.
… …
System.out.println("Game Ended"); synchronized(mythread){ mythread.notify(); }
Básicamente, al hacer una llamada a wait (), el código espera en el monitor del hilo y una llamada a notify () hace que un hilo de espera en el monitor del objeto se despierte. Además, puede utilizar notifyAll () para activar todos los subprocesos en espera.
Como alternativa, puede utilizar la versión de espera de tiempo de espera (), donde espera el encabezado hasta que se notifica o se agota.
- Android – botón del menú de la demostración en el nexo de la galaxia
- ¿Cómo implementar Enlaces de aplicaciones de Android con dominios comodín?