2010-06-06 30 views
13

Estoy construyendo una consola Sudoku Solver donde el objetivo principal es velocidad bruta.¿Cómo reutilizar un hilo en Java?

Ahora tengo un ManagerThread que inicia WorkerThreads para calcular los nébirds de cada celda. Entonces, se inicia un WorkerThread para cada celda en este momento. ¿Cómo puedo volver a utilizar un hilo existente que ha completado su trabajo?

El Thread Pool Pattern parece ser la solución, pero no entiendo qué hacer para evitar que el hilo muera una vez que se haya completado su trabajo.

ps: No espero obtener mucho rendimiento para esta tarea en particular, solo quiero experimentar cómo funciona el multi-threading antes de aplicarlo a las partes más complejas del código.

Gracias

+1

más investigaciones sobre cómo funciona: http://stackoverflow.com/questions/2324030/java-thread-reuse -stackoverflow – Eddy

Respuesta

14

Eche un vistazo a la Java SE proporciona java.util.concurrent API. Puede crear un grupo de hilos usando Executors#newFixedThreadPool() y puede enviar tareas utilizando los métodos ExecutorService. No es necesario reinventar su propio grupo de subprocesos. También vea el Sun tutorial on the subject.

+0

1 (como de costumbre) ... –

+2

@David: tenga en cuenta que para tareas de computación pura, tener más hilos que núcleos disponibles ralentizará, en lugar de acelerar, su código. Obviamente eso cambia si tiene un bloqueo de subprocesos en E/S o algo así. –

+4

@ T.J. tiene un buen punto. @David, compruebe ['Runtime # availableProcessors()'] (http://java.sun.com/javase/6/docs/api/java/lang/Runtime.html#availableProcessors%28%29). – BalusC

3

cuando se utiliza un grupo de subprocesos (java.util.concurrent), en realidad nunca se inicializó un subproceso, sino que se transfieren Runnables al grupo de subprocesos. no tiene que preocuparse por el ciclo de vida del hilo, simplemente haga lo que necesite hacer en el ejecutable y déjelo salir cuando lo haya hecho.

0

Bueno, si tuviera que codificar esta lógica mi mismo en lugar de utilizar un paquete como cuarzo de OpenSymphony, yo haría lo siguiente: que tendría un WorkerThread que se extiende hilo. Esta clase también tendrá propiedad privada llamada ejecutable que es Ejecutable. Esta propiedad tendrá una referencia al código que le gustaría ejecutar. Tener un organismo público para ello. El código del subproceso principal comenzará ejecutando el ejecutable con el que lo inicializó y luego cambiará a un estado de espera. Antes de hacerlo, marcará al administrador de la agrupación que ha finalizado y puede devolverse al grupo. La próxima vez que necesite un hilo, elija uno del grupo, llame a setRunnable, que establece la propiedad ejecutable, y luego despierta el hilo. Volverá al trabajo, ingrese el bucle infinito: ejecutable y ejecutable y vuelva al estado de espera.

Cuestiones relacionadas