El enfoque en la respuesta de Kylar es el correcto. Utilice las clases ejecutadoras proporcionadas por las bibliotecas de clase de Java en lugar de implementar la agrupación de subprocesos usted mismo desde cero (mal).
Pero pensé que podría ser útil para discutir el código en su pregunta y por qué no funciona. (He llenado en algunas de las piezas que dejas a cabo lo mejor que pueda ...)
public class MyThread extends Thread {
private static int counter;
public MyThread(String fileName, Object lock) {
// Save parameters in instance variables
}
public void run() {
// Do stuff with instance variables
counter--;
}
public static void main(String[] args) {
// ...
for (final File filename : folder.listFiles()) {
Object lock1 = new Object();
new MyThread(filename, lock1).start();
counter++;
while (counter > 5);
}
// ...
}
}
bien, así que lo que está mal con esto? ¿Por qué no funciona?
Bueno, el primer problema es que en main
está leyendo y escribiendo counter
sin hacer ninguna sincronización. Supongo que también está siendo actualizado por los hilos de trabajo; de lo contrario, el código no tiene sentido. Entonces eso significa que hay una buena posibilidad de que los hilos principales no vean el resultado de las actualizaciones hechas por los hilos hijo. En otras palabras, while (counter > 5);
podría ser un bucle infinito. (De hecho, esto es bastante probable. Se permite que el compilador JIT para generar código en el que el counter > 5
simplemente pone a prueba el valor de counter
la izquierda en un registro después de la counter++;
declaración anterior.
El segundo problema es que el bucle while (counter > 5);
es un desperdicio increíble de recursos. Le está diciendo a la JVM que sondee una variable ... y hará esto potencialmente BILLONES de veces por segundo ... ejecutando un procesador (núcleo) a toda máquina. No debería hacer eso. va a poner en práctica este tipo de cosas usando primitivas de bajo nivel, se debe utilizar Object.wait()
y Object.notify()
métodos de Java; por ejemplo, las principales hilo espera, y cada subproceso de trabajo notifica
+1. No tiene sentido reinventar la rueda. Aunque creo que te refieres a ThreadPoolExecutor. No hay ExecutorPool en J2SE que yo sepa. –
Jdk5 en adelante, hay muchas clases de inbuit para el manejo de subprocesos.Como kylar sugirió que es mejor usar Executorpool – kosa
Sí, quise decir ExecutorService en realidad. Se corrigió y agregó el código fuente bruto aproximado para darle la esencia. – Kylar