import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.Callable;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
public class Main {
public static void main(String[] args) throws InterruptedException {
ExecutorService executor = Executors.newFixedThreadPool(Runtime
.getRuntime().availableProcessors() + 1);
List<Particle> allTheParticles = new ArrayList<>();
for (int i = 0; i < 20; i++) {
allTheParticles.add(new Particle(i, allTheParticles));
}
while (true) {
executor.invokeAll(allTheParticles);
executor.invokeAll(allTheParticles);
}
}
}
class Particle implements Callable<Void> {
int id;
int calculatedForce;
State particleState = State.Update;
List<Particle> allTheParticles;
public Particle(int id, List<Particle> allTheParticles) {
this.id = id;
this.allTheParticles = allTheParticles;
}
private void calculateNetForce() {
System.out.println("calculation in " + id);
String someIntenseOperation = "";
for (int i = 0; i < 10000; i++) {
someIntenseOperation += allTheParticles.size();
}
System.out.println("someIntenseOperation:"+someIntenseOperation);
calculatedForce = 0;
particleState = State.Calculate;
}
private void updatePosition() {
System.out.println("updating position of " + id);
particleState = State.Update;
}
@Override
public Void call() throws Exception {
switch (particleState) {
case Calculate:
updatePosition();
break;
case Update:
calculateNetForce();
break;
}
return null;
}
}
enum State {
Update, Calculate
}