2012-04-10 29 views
10

Cada vez que tengo que crear un número variable de subprocesos. Lo hago creando una matriz de Hilos y creando múltiples hilos.Creación de número dinámico de subprocesos simultáneamente

Pero, no entiendo cómo comenzar este n número de subprocesos comportándose como un concepto de subprocesamiento múltiple. Quiero que se ejecuten en paralelo.

Por favor guía si qué hacer en este senario.

+0

Asegúrese de aceptar mi respuesta si fue útil. – Gray

Respuesta

2

psuedocode básica:

create x threads, store them in an array or list; 
for each thread in the list/array 
    call start() on the thread object; 
+0

Si lo hago, los hilos no se ejecutan en paralelo. Pero, se ejecutan de forma secuencial como una función normal, llame al – sowmya

+0

@sowmya. Creo que debe leer los hilos. Llamar a start() en un grupo de hilos secuencialmente no significa que se ejecuten secuencialmente, solo significa que se inician secuencialmente. –

+0

Pero, están ejecutando la función secuencialmente en el orden en que las inicio. Según mi conocimiento, al menos la salida debería cambiar. Pero, no está sucediendo. Corrígeme si estoy equivocado. – sowmya

33

Pero, no entiendo cómo iniciar estos número n de hilos comportándose como concepto de múltiples subprocesos. Quiero que se ejecuten en paralelo.

Por supuesto que puede crear una matriz de hilos utilizando un bucle:

Thread[] threads = new Thread[NUM_JOBS_TO_CREATE]; 
for (int i = 0; i < threads.length; i++) { 
    threads[i] = new Thread(new Runnable() { 
     public void run() { 
      // some code to run in parallel 
      // this could also be another class that implements Runnable 
     } 
    }); 
    threads[i].start(); 
} 

Esto hará que los hilos se ejecuten en segundo plano en paralelo. Luego puede unirse a ellos más tarde para esperar a que todos los completen antes de continuar.

// wait for the threads running in the background to finish 
for (Thread thread : threads) { 
    thread.join(); 
} 

Pero en lugar de gestionar los hilos usted mismo, yo recomendaría usar la orden interna Java Executors. Hacen todo esto porque son más fáciles de administrar. Una de las ventajas de este método es que separa las tareas de los hilos que las ejecutan. Puede comenzar, por ejemplo, 10 hilos para ejecutar 1000 y 1000 de tareas en paralelo.

He aquí algunos ejemplos de ExecutorService código:

// create a pool of threads, 10 max jobs will execute in parallel 
ExecutorService threadPool = Executors.newFixedThreadPool(10); 
// submit jobs to be executing by the pool 
for (int i = 0; i < NUM_JOBS_TO_CREATE; i++) { 
    threadPool.submit(new Runnable() { 
     public void run() { 
      // some code to run in parallel 
      // this could also be another class that implements Runnable 
     } 
    }); 
} 
// once you've submitted your last job to the service it should be shut down 
threadPool.shutdown(); 
// wait for the threads to finish if necessary 
threadPool.awaitTermination(Long.MAX_VALUE, TimeUnit.MILLISECONDS); 

Para obtener más información, consulte la Java tutorial on the thread executors.

+0

si tengo 1000 trabajos creará 1000 objetos que darían como resultado un problema de rendimiento –

+0

1000 objetos son bastante baratos @ManojRamanan. 1000 cadenas son más costosas desde la perspectiva del ancho de banda de un objeto. Es posible que notes algunos problemas de GC si creaste un millón de objetos, por lo que normalmente ponemos límites en la cola en caso de que el productor 'Runnable' sea mucho más rápido que los consumidores. – Gray

+0

Gracias, @Gray por la información.pueden compartir otra información. Actualmente estoy usando esta implementación. Cómo lo prueban –

2

Trate de no crear arreglos de hilos e intente administrarlos, pronto se convertirá en un desastre. Si necesita un grupo de subprocesos para ejecutar tareas, necesita una cola productor-consumidor. Cree uno y páselo (o la instancia del objeto de subprocesamiento que lo contiene como miembro) a los subprocesos a medida que los crea. Los hilos giran en redondo, buscando tareas y ejecutándolas.

La manera más fácil de hacerlo es utilizar un ExecutorService como se detalla en @Gray, (+1).

Para enfatizar, repito, no intente microgestionar hilos en matrices, listas o vectores, iniciándolos, verificando su estado en un ciclo 'jefe/gestión', finalizándolos/abortándolos, destruyéndolos, etc. etc. Es como un Porsche 911: después de gastar una gran cantidad de dinero/tiempo para obtener uno, tendrá algo que parece funcionar bien y luego se romperá repentinamente y lo derribará en un árbol.

Utilice un hilo dedicado para trabajos que se bloqueen durante períodos prolongados, un hilo de rosca para aquellos que se pueden hacer de manera intensa y rápida.

+0

Gracias Martin !!! Funcionó ... Seguí el concepto de ExecutoeService. – sowmya

0

En una clase que necesita ser multihilo me puse en la parte superior de la clase:

private static final ExecutorService executor = Executors.newCachedThreadPool();

& en Java 8+ utilizar una expresión lambda donde necesito algo para funcionar en un nuevo hilo:

executor.submit(() -> { 
     myOtherClass.myFunction(doSomething); 
}); 

con un newCachedThreadPool Java gestionará el número total de hilos de acuerdo con el número de núcleos de CPU en el sistema & detendrá automáticamente después de un período de ina ctividad (60 segundos por defecto).

Cuestiones relacionadas