Esto es un pequeño codekata en Java para lanzar procesos concurrentes en Java. Lo podemos hacer con las clases Thread o Runnable. Por un lado tenemos la interfaz Runnable, que proporciona la base para correr procesos en hilos independientes. Y por otro lado tenemos también la clase Thread, que extiende de Runnable, que implementa los procesos a ejecutar más fácilmente.
Proceso principal que lanza varios procesos
El siguiente código simplemente genera KTAM hilos de ejecución:
import testingConcurrency.TestThread;
import testingConcurrency.TestRunnable;
public class Main {
private static final int KTAM = 3;
private static final int KFOR1 = 300000;
private static final int KFOR2 = 300000;
public static void main(String[] args) {
System.out.println("Starting..");
TestThread[] threads1 = new TestThread[KTAM];
for (int i = 0; i < KTAM; i++) {
threads1[i] = new TestThread(KFOR1);
threads1[i].start();
}
Thread[] threads2 = new Thread[KTAM];
for (int i = 0; i < KTAM; i++) {
threads2[i] = new Thread(new TestRunnable(KFOR2));
threads2[i].start();
}
}
}
El uso de Runnable directamente es más complejo que el de la clase Thread. Dentro de cada hilo implementa unos bucles para que aplique vaya sumando un contador.
Implementando la interfaz Runnable
El código de implementar la interfaz Runnable podría ser algo tal que así:
package testingConcurrency;
public class TestRunnable implements Runnable {
private int KFOR2;
public TestRunnable(int KFOR2) {
this.KFOR2 = KFOR2;
}
@Override
public void run() {
int counter = 0;
for (int i = 0; i < this.KFOR2; i++) {
for (int j = 0; j < this.KFOR2; j++) {
for (int k = 0; k < this.KFOR2; k++) {
// Do nothing, only iterating..
counter++;
}
}
}
}
}
Extendiendo de Thread
Y el código extendiendo de Thread es muy parecido:
package testingConcurrency;
public class TestThread extends Thread {
private int KFOR1;
public TestThread(int KFOR1) {
this.KFOR1 = KFOR1;
}
@Override
public void run() {
super.run();
int counter = 0;
for (int i = 0; i < this.KFOR1; i++) {
for (int j = 0; j < this.KFOR1; j++) {
for (int k = 0; k < this.KFOR1; k++) {
// Do nothing, only iterating..
counter++;
}
}
}
}
}
Cómo se ve al ejecutarse en el procesador
Si todo va bien, se debería de ver algo tal que así:
Cómo KTAM vale 3, tenemos el hilo padre y 3 hijos, los 3 primeros procesos del listado.