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:

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.

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.

  • Cómo suspender y reanudar los hilos en android?
  • La mejor manera de enviar solicitudes HTTP GET ansynchronously en Android?
  • ¿El límite de los hilos en android?
  • Puedo matar o terminar () una actividad en un hilo que no sea el hilo de la interfaz de usuario ...?
  • Espere un hilo antes de continuar en Android
  • Android "Sólo el subproceso original que creó una jerarquía de vistas puede tocar sus vistas."
  • Android kill thread específico en evento barra de acción
  • ¿Cómo textView.setText de hilo?
  • Hacer un hilo que cancela una llamada de InputStream.read () si ha pasado el tiempo 'x'
  • Llamada Hilo principal de hilo secundario en Java / Android
  • Bloques sincronizados android
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.