Foros del Web » Programación para mayores de 30 ;) » Java »

No puedo esperar que termine un thread en Java; ¿es buena idea dormirlo manualmente?

Estas en el tema de No puedo esperar que termine un thread en Java; ¿es buena idea dormirlo manualmente? en el foro de Java en Foros del Web. Hola compañeros! Estoy estudiando los threads o hilos en Java, y hay algo que me trae de cabeza con esto. Ojalá puedan echarme una mano ...
  #1 (permalink)  
Antiguo 29/03/2020, 13:43
Avatar de berkeleyPunk  
Fecha de Ingreso: febrero-2013
Ubicación: México :C
Mensajes: 564
Antigüedad: 8 años, 5 meses
Puntos: 22
Sonrisa No puedo esperar que termine un thread en Java; ¿es buena idea dormirlo manualmente?

Hola compañeros!

Estoy estudiando los threads o hilos en Java, y hay algo que me trae de cabeza con esto. Ojalá puedan echarme una mano con esto. Sé que existen varias formas de sincronizarlos, por ejemplo utilizando join(), synchronized, wait() y notify(), ReentrantLock(), etc. Sin embargo éstos no me están ayudando.

PROBLEMA. Tengo un hilo1 que recupera información de una base de datos y la guarda en una serie de variables. Hasta aquí todo va perfecto. El problema es que no logro hacer que después y sólo después que terminó de ejecutarse este hilo1, se ejecute otro código encargado de utilizar esas variables.

Código Java:
Ver original
  1. @Override
  2. protected void onCreate(Bundle savedInstanceState) {
  3.     super.onCreate(savedInstanceState);
  4.     setContentView(R.layout.activity_main);
  5.  
  6.     Hilo1 hilo1 = new Hilo1(MainActivity.this);
  7.     hilo1.setName("Hilo1");
  8.     hilo1.start();
  9.  
  10.     rv = (RecyclerView) findViewById(R.id.rv);
  11.     rv.setLayoutManager(new LinearLayoutManager(this));
  12.     rv.setAdapter(new RecyclerViewAdapter(MainActivity.this, paginador.generatePage(paginaActual))); // Línea ALFA
  13. }

Como se ve en el código de aquí arriba, estoy ejecutando el hilo1, y abajo, en la última línea del onCreate(), se ejecuta la línea encargada de manipular la UI (metiendo información a un RecyclerView). A esta línea la llamaré ALFA (por economía del lenguaje). Alfa llama a un método generatePage() que utiliza las variables que comentaba antes.

Claramente alfa se ejecuta dentro del hilo main, el cual no espera a que termine el hilo1. Es decir, ambos hilos son concurrentes. Por tanto, antes que termine el hilo1 ya se ejecutó alfa.

La pregunta es: ¿cómo lograr que alfa se ejecute después y sólo después que muera el hilo1?

La primera idea que se me ocurrió fue meter alfa dentro de un hilo2, y así lograr fácilmente que el hilo2 se ejecute después del hilo1 mediante join(). Lo hice y me encontré con 2 problemas: A) Resulta que por defecto los threads en Java no pueden modificar la UI, y B) Encontré la forma de manipular la UI desde un thread, sin embargo poco importa que se pueda hacer esto, ya que esa manipulación se ejecuta desde el hilo main, no desde el hilo2 (lo sé porque Thread.currentThread().getName() así lo indica), así que de nada sirve que meta alfa dentro de un hilo2, que sería este:

Código Java:
Ver original
  1. public void run() {
  2.     try {
  3.         hilo1.join(); // Este join espera a que muera el hilo1, y sólo después ejecuté el código de este hilo2
  4.     }
  5.     catch (InterruptedException e) {
  6.         e.printStackTrace();
  7.     }
  8.  
  9.     // Así es como manipulo la UI desde el hilo2:
  10.     Handler handler = new Handler(Looper.getMainLooper());
  11.     handler.post(new Runnable() {
  12.         @Override
  13.         public void run() {
  14.             // El contenido del run() de este handler NO se ejecuta dentro del hilo2 sino dentro del hilo main
  15.             rv.setAdapter(new RecyclerViewAdapter(contexto, paginador.generatePage(paginaActual))); // Aquí manipulo la UI
  16.         }
  17.     });
  18. }

Por todo lo dicho, la única forma que se me ocurre de lograr que alfa se ejecute después que terminó/murió el hilo1, es haciendo un sleep(2000); entre el hilo1 y alfa. Esta solución me parece ser la más sucia y poco elegante que pudiera existir. Sin embargo lo pregunto, por si acaso resulta que no es tan mala solución.

Saludos,

Última edición por berkeleyPunk; 29/03/2020 a las 15:59
  #2 (permalink)  
Antiguo 23/04/2021, 13:21
Avatar de chuidiang
Colaborador
 
Fecha de Ingreso: octubre-2004
Mensajes: 3.774
Antigüedad: 16 años, 10 meses
Puntos: 454
Respuesta: Si no puedo esperar que termine un tread en Java, ¿es buena idea dormirlo

¿Has probado a poner hilo1.join() antes de ejecutar alfa?

Y más sencillo todavía. Si alfa tiene que esperar por hilo1 .... ¿por qué crear un hilo?. La idea del hilo es que el código que lanza el hilo siga ejecutando las siguientes líneas. Si tiene que esperar, no tiene sentido lanzar un hilo.

Se bueno.
__________________
Apuntes Java
Wiki de Programación
  #3 (permalink)  
Antiguo 23/04/2021, 14:18
 
Fecha de Ingreso: abril-2006
Mensajes: 583
Antigüedad: 15 años, 3 meses
Puntos: 120
Respuesta: Si no puedo esperar que termine un tread en Java, ¿es buena idea dormirlo

Cita:
Iniciado por chuidiang Ver Mensaje
¿Has probado a poner hilo1.join() antes de ejecutar alfa?

Y más sencillo todavía. Si alfa tiene que esperar por hilo1 .... ¿por qué crear un hilo?. La idea del hilo es que el código que lanza el hilo siga ejecutando las siguientes líneas. Si tiene que esperar, no tiene sentido lanzar un hilo.

Se bueno.
seguro fue por que es JAVA sobre ANDROID, y hacer que el MAIN, este en espera, es lo mismo que COLGAR la APP y este si pasa de un tiempo es reportado al ANDROID y le da la opcion de CERRAR la APP por que se colgo


lo correcto son los HILOS, pero veo que no esta leyendo la documentacion de java en android.

no se las clases de memoria. pero sabia que en los Tthreads con android habia el methodo Syncronized o algo asi que, con ello podias comunicarte con tu APP android y manipular la UI . asi en tu HILO 1 muera , eeste llame a HILO2, y para manipular la UI seguramente para refrescar la aparcia o quitar tu LOADING, uses el sincronyze y asunto resuelto
__________________
Mis aportes te ayudaron??, te hicieron ahorrar valiosos tiempo??, si quieres puedes agradecerme con un Gracias o con una donacion
https://paypal.com/pools/c/8lmNLmWnG9



La zona horaria es GMT -6. Ahora son las 16:51.