2012-05-08 15 views
6

Tengo un programa que realiza cálculos de larga duración, por lo que quiero acelerar su rendimiento. Así que traté de lanzar 3 hilos en este momento, pero java.exe aún ocupa el 25% del uso de la CPU (por lo tanto, solo se usa una CPU), y permanece incluso si trato de usar .setPriority(Thread.MAX_PRIORITY); y establezco la prioridad de java.exe en tiempo real (24) . Traté de usar RealtimeThread pero parece que funciona aún más lento. Sería perfecto si cada subproceso se asignara a un procesador y el uso total de la CPU aumentara al 75%, pero no sé cómo hacerlo. Y así es como se ve mi código en este momento:¿Por qué mi programa enhebrado solo usa una CPU?

Thread g1 = new MyThread(i,j); 
g1.setPriority(Thread.MAX_PRIORITY); 
g1.run(); 
Thread g2 = new MyThread(j,i); 
g2.setPriority(Thread.MAX_PRIORITY); 
g2.run(); 
Thread g3 = new MyThread(i,j); 
g3.setPriority(Thread.MAX_PRIORITY); 
g3.run(); 
if (g1.isAlive()) { 
     g1.join(); 
} 
if (g2.isAlive()) { 
     g2.join(); 
} 
if (g3.isAlive()) { 
     g3.join(); 
} 
+2

Use '.start()' como lo han señalado otros, y entonces * probablemente * quiera dejar la programación en el planificador en lugar de jugar con las prioridades usted mismo. A menos que sepa * bastante * mucho sobre la programación de hilos, las posibilidades de hacer el trabajo del planificador mejor que las que tiene son escasas (en el mejor de los casos). –

+0

posible duplicado de [java thread - run() y start() métodos] (http://stackoverflow.com/questions/3027495/java-thread-run-and-start-methods) –

Respuesta

23

Usted no está usando hilos.

Debe llamar al .start(), no al .run().

11

Esto no tiene nada que ver con las CPU: en realidad no estás iniciando 3 subprocesos, estás ejecutando todo en el hilo principal. Para iniciar un hilo, llame a su método start(), no a run().

6

En primer lugar, como sugieren los demás, en realidad no está utilizando múltiples hilos. Esto se debe a que está llamando al método run(), que termina haciendo el trabajo en el hilo de llamada.

Ahora, para abordar el resto de su pregunta, lo que quiero decir es cómo se maximiza la eficiencia de un proceso multiproceso. Esta no es una pregunta simple, pero te daré los conceptos básicos. (Otros, siéntase libre de entrar).

La mejor manera de maximizar la eficiencia de su proceso es intentar que todos los hilos hagan la misma cantidad de trabajo, y tratar de evitar que bloqueen. Es decir, es su trabajo "equilibrar" la carga de trabajo para hacer que la aplicación se ejecute de manera eficiente.

En general, no puede asignar un hilo para ejecutar en un núcleo de CPU en particular; ese suele ser el trabajo del sistema operativo y las CPU. El sistema operativo programa el proceso (usando las prioridades que usted proporciona) y luego las CPU pueden hacer su propia programación en el nivel de instrucción. Además de establecer las prioridades, el resto de la programación está completamente fuera de tu control.

EDIT: Soy adicto al punto y coma.

Cuestiones relacionadas