OnJava8-Examples/concurrency/FastSimulation.java
2015-11-14 16:18:05 -08:00

75 lines
2.4 KiB
Java

// concurrency/FastSimulation.java
// ©2016 MindView LLC: see Copyright.txt
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 Random rand = new Random(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 exec = 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++)
exec.execute(new Evolver());
TimeUnit.SECONDS.sleep(5);
exec.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
*/