La razón de que actualmente no te funcione es que los tipos primitivos como int se copian cuando los pasas como parámetro. Al copiarse, es otro objeto diferente, y aunque lo modifiques, el original se queda igual. Para pasar objetos, tendrías que utilizar clases en vez de tipos primitivos.
Tendrías que meter la variable dentro de una clase y compartir un objeto de esa clase con las 2 que lo van a modificar. Otra opción es tenerlo como variable static y que accedan directamente a ella.
Dado que el acceso concurrente te acabaría dando problemas, puedes usar la clase AtomicInteger que sirve precisamente para eso: Modificar un int desde varios hilos. Podrías crearla en el main, y pasárselo al constructor de los otros 2 como haces ahora.
Tendrías que meter la variable dentro de una clase y compartir un objeto de esa clase con las 2 que lo van a modificar. Otra opción es tenerlo como variable static y que accedan directamente a ella.
Dado que el acceso concurrente te acabaría dando problemas, puedes usar la clase AtomicInteger que sirve precisamente para eso: Modificar un int desde varios hilos. Podrías crearla en el main, y pasárselo al constructor de los otros 2 como haces ahora.
Al final lo he resuelto pasando la propia clase como has dicho. No me ha hecho falta usar AtomicInteger.
Dejo el código para quien pudiera estar interesado:
Clase principal:
Código:
public class Principal {
public volatile static int x;
public Principal() {
x = 0;
}
public static void main(String[] args) throws InterruptedException {
Incrementador[] inc = new Incrementador[1000];
Decrementador[] dec = new Decrementador[1000];
Thread hiloinc;
Thread hilodec;
for(int i=0; i<1000; i++) {
inc[i] = new Incrementador();
dec[i] = new Decrementador();
hiloinc = new Thread(inc[i]);
hilodec = new Thread(dec[i]);
hiloinc.start();
hilodec.start();
hiloinc.join();
hilodec.join();
}
System.out.println(x);
}
}
Clase Incrementador:
Código:
public class Incrementador implements Runnable {
public void run() {
Principal.x = Principal.x+1;
}
}
Clase Decrementador:
Código:
public class Decrementador implements Runnable {
public void run() {
Principal.x = Principal.x-1;
}
}
Gracias a todos!