Puede determinar el número de procesos disponibles para la máquina virtual Java mediante el método de tiempo de ejecución estático, availableProcessors . Una vez que haya determinado la cantidad de procesadores disponibles, cree esa cantidad de subprocesos y divida su trabajo en consecuencia.
Actualización : para aclarar aún más, un hilo es solo un objeto en Java, por lo que puede crearlo como lo haría con cualquier otro objeto. Entonces, digamos que llama al método anterior y encuentra que devuelve 2 procesadores. Increíble. Ahora, puede crear un bucle que genere un nuevo subproceso, y divida el trabajo para ese subproceso y lo dispare. Aquí hay un psuedocode para demostrar lo que quiero decir:
int processors = Runtime.getRuntime().availableProcessors();
for(int i=0; i < processors; i++) {
Thread yourThread = new AThreadYouCreated();
// You may need to pass in parameters depending on what work you are doing and how you setup your thread.
yourThread.start();
}
Para obtener más información sobre cómo crear su propio hilo, diríjase a este tutorial . Además, es posible que desee consultar Thread Pooling para la creación de los hilos.
Probablemente también desee ver el marco java.util.concurrent para estas cosas. Algo como:
o
Esto es mucho mejor que lidiar con tus propios grupos de subprocesos, etc.
fuente
Opción 1:
newWorkStealingPool de
Executors
Con esta API, no necesita pasar un número de núcleos a
ExecutorService
.Implementación de esta API desde grepcode
Opcion 2:
newFixedThreadPool API de
Executors
oother newXXX constructors
, que devuelveExecutorService
reemplace nThreads con
Runtime.getRuntime().availableProcessors()
Opcion 3:
ThreadPoolExecutor
pasar
Runtime.getRuntime().availableProcessors()
como parámetro amaximumPoolSize
.fuente
Doug Lea (autor del paquete concurrente) tiene este artículo que puede ser relevante: http://gee.cs.oswego.edu/dl/papers/fj.pdf
El marco Fork Join se ha agregado a Java SE 7. A continuación se muestran algunas referencias más:
http://www.ibm.com/developerworks/java/library/j-jtp11137/index.html Artículo de Brian Goetz
http://www.oracle.com/technetwork/articles/java/fork-join-422606.html
fuente
La forma estándar es el método Runtime.getRuntime (). AvailableProcessors (). En la mayoría de las CPU estándar, habrá devuelto aquí el número de subprocesos óptimo (que no es el número real de núcleos de CPU). Por tanto, esto es lo que estás buscando.
Ejemplo:
NO olvide cerrar el servicio ejecutor de esta manera (o su programa no se cerrará):
Aquí solo un breve resumen de cómo configurar un código MT basado en el futuro (fuera de tema, para ilustración):
Luego, debe realizar un seguimiento de cuántos resultados espera y recuperarlos de esta manera:
fuente
En la clase Runtime, hay un método llamado availableProcessors (). Puede usar eso para averiguar cuántas CPU tiene. Dado que su programa está vinculado a la CPU, probablemente querrá tener (como máximo) un hilo por CPU disponible.
fuente