// threads/FastSimulation.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://mindviewinc.com/Books/OnJava/ for more book information. import java.util.concurrent.*; import java.util.concurrent.atomic.*; import java.util.*; public class FastSimulation { static final int N_ELEMENTS = 100000; static final int N_GENES = 30; static final int N_EVOLVERS = 50; static final AtomicInteger[][] GRID = new AtomicInteger[N_ELEMENTS][N_GENES]; static SplittableRandom rand = new SplittableRandom(47); static class Evolver implements Runnable { @Override public void run() { while(!Thread.interrupted()) { // Randomly select an element to work on: int element = rand.nextInt(N_ELEMENTS); for(int i = 0; i < N_GENES; i++) { int previous = element - 1; if(previous < 0) previous = N_ELEMENTS - 1; int next = element + 1; if(next >= N_ELEMENTS) next = 0; int oldvalue = GRID[element][i].get(); // Perform some kind of modeling calculation: int newvalue = oldvalue + GRID[previous][i].get() + GRID[next][i].get(); newvalue /= 3; // Average the three values if(!GRID[element][i] .compareAndSet(oldvalue, newvalue)) { // Policy here to deal with failure. Here, we // just report it and ignore it; our model // will eventually deal with it. System.out.println( "Old value changed from " + oldvalue); } } } } } public static void main(String[] args) throws Exception { ExecutorService es = Executors.newCachedThreadPool(); for(int i = 0; i < N_ELEMENTS; i++) for(int j = 0; j < N_GENES; j++) GRID[i][j] = new AtomicInteger(rand.nextInt(1000)); for(int i = 0; i < N_EVOLVERS; i++) es.execute(new Evolver()); TimeUnit.SECONDS.sleep(5); es.shutdownNow(); } } /* Output: (First and last 10 Lines) Old value changed from 542 Old value changed from 447 Old value changed from 446 Old value changed from 643 Old value changed from 419 Old value changed from 573 Old value changed from 668 Old value changed from 710 Old value changed from 800 Old value changed from 406 ________...________...________...________...________ Old value changed from 458 Old value changed from 436 Old value changed from 475 Old value changed from 501 Old value changed from 526 Old value changed from 465 Old value changed from 467 Old value changed from 368 Old value changed from 404 Old value changed from 428 */