thread terminado saber resueltos metodos hilos fuente esperar ejemplos codigo clase java multithreading swing download wait

terminado - Java Espera a que el hilo termine



metodos de la clase thread java (9)

Tengo un hilo descargando datos y quiero esperar hasta que termine la descarga antes de cargar los datos. ¿Hay una forma estándar de hacer esto?

Más información:

Tengo una clase de descarga que obtiene datos de una URL (POJO serializados). La descarga es ejecutable y observable. Realiza un seguimiento de los bytes descargados y el tamaño de descarga. Tengo una barra de progreso que muestra el progreso al usuario. La GUI observa Descargar para actualizar la barra de progreso.

Cuando el POJO se descargue, quiero obtenerlo y pasar al siguiente paso. Cada paso tiene que esperar a que lo anterior termine. El problema es que no puedo pensar en una forma de pausar mi aplicación para esperar el hilo de descarga. Una vez que la descarga haya finalizado, deseo llamar a download.getObject (), que devolverá los datos como un objeto. Puedo lanzarlo y continuar con la próxima descarga.

Tengo una clase de ayuda que gestiona las URL para descargar y realiza todas las llamadas para descargar. Esta llamada llamará a getObject y hará el casting. El Gui llama a helper.getUser (). helper inicia el hilo ejecutándose y quiero que ''sepa'' cuando esté terminado para que pueda devolver el objeto fundido.

Alguna sugerencia / ejemplo? Estoy en las etapas iniciales de este diseño, así que estoy dispuesto a cambiarlo.

Gracias por su amabilidad.

Actualizar:

Seguí http://download.oracle.com/javase/6/docs/api/javax/swing/SwingWorker.html#get y usé modal para bloquear hasta que termine el hilo. El código fue muy complicado y no me gusta este enfoque. Seguiré tratando de encontrar una forma "limpia" de manejar el flujo de trabajo de los procesos de descarga.


Alguna sugerencia / ejemplo? Seguí a SwingWorker ... El código era muy complicado y no me gusta este enfoque.

En lugar de get() , que espera su finalización, use process() y setProgress() para mostrar resultados intermedios, como se sugiere en este example simple o en este example relacionado.


El método join() permite que un subproceso espere la finalización de otro. Sin embargo, al igual que con el sueño, join depende del sistema operativo para el tiempo, por lo que no debe suponer que el join esperará exactamente el tiempo que especifique.


En general, cuando quiere esperar a que termine un hilo, debe llamar a join() en él.


Me imagino que está llamando a su descarga en un hilo de fondo como el proporcionado por un SwingWorker. Si es así, simplemente llame al siguiente código secuencialmente en el mismo método doInBackground de SwingWorker.


Puede usar CountDownLatch del paquete java.util.concurrent . Es muy útil cuando se espera que se completen uno o más subprocesos antes de continuar la ejecución en el subproceso en espera.

Por ejemplo, esperando que se completen tres tareas:

CountDownLatch latch = new CountDownLatch(3); ... latch.await(); // Wait for countdown

El (los) otro (s) hilo (s) llama (n) cada uno a latch.countDown() cuando se completa con sus tareas. Una vez que se complete la cuenta atrás, tres en este ejemplo, la ejecución continuará.


Puede usar join() para esperar terminar todos los hilos. Mantenga todos los objetos de subprocesos en la matriz global en el momento de crear subprocesos. Después de eso, mantenlo en un ciclo como a continuación:

for (int i = 0; i < 10; i++) { Thread T1 = new Thread(new ThreadTest(i)); T1.start(); arrThreads.add(T1); } for (int i = 0; i < arrThreads.size(); i++) { arrThreads.get(i).join(); }

Consulte aquí para obtener detalles completos: http://www.letmeknows.com/2017/04/24/wait-for-threads-to-finish-java


Se han desarrollado mejores alternativas para el método join() durante un período de tiempo.

ExecutorService.html#invokeAll es una alternativa.

Ejecuta las tareas dadas, devolviendo una lista de futuros que mantienen su estado y resultados cuando todo se completa. Future.isDone () es verdadero para cada elemento de la lista devuelta.

Tenga en cuenta que una tarea completa puede haber terminado normalmente o lanzando una excepción. Los resultados de este método no están definidos si la colección dada se modifica mientras esta operación está en progreso.

ForkJoinPool o Executors.html#newWorkStealingPool ofrece otras alternativas para lograr el mismo propósito.

Fragmento de código de ejemplo:

import java.util.concurrent.*; import java.util.*; public class InvokeAllDemo{ public InvokeAllDemo(){ System.out.println("creating service"); ExecutorService service = Executors.newFixedThreadPool(Runtime.getRuntime().availableProcessors()); List<MyCallable> futureList = new ArrayList<MyCallable>(); for ( int i=0; i<10; i++){ MyCallable myCallable = new MyCallable((long)i); futureList.add(myCallable); } System.out.println("Start"); try{ List<Future<Long>> futures = service.invokeAll(futureList); }catch(Exception err){ err.printStackTrace(); } System.out.println("Completed"); service.shutdown(); } public static void main(String args[]){ InvokeAllDemo demo = new InvokeAllDemo(); } class MyCallable implements Callable<Long>{ Long id = 0L; public MyCallable(Long val){ this.id = val; } public Long call(){ // Add your business logic return id; } } }


SwingWorker tiene doInBackground() que puede usar para realizar una tarea. Tiene la opción de invocar get() y esperar a que se complete la descarga o puede anular el método done() que se invocará en el hilo de envío del evento una vez que el SwingWorker finalice.

El Swingworker tiene ventajas con respecto a su enfoque actual, ya que tiene muchas de las funciones que está buscando, por lo que no es necesario reinventar la rueda. Puede utilizar los métodos getProgress() y setProgress() como una alternativa a un observador en el ejecutable para el progreso de la descarga. El método done() como dije anteriormente se invoca después de que el trabajador termina de ejecutarse y se realiza en el EDT, esto le permite cargar los datos después de que la descarga se haya completado.


Thread tiene un método que hace eso por ti. join bloqueará hasta que el subproceso haya terminado de ejecutarse.