blob: bb273671c72d3ec1bf5ec287c49b0e42d2ee306d [file] [log] [blame]
/**
* The Computer Language Benchmarks Game
* http://shootout.alioth.debian.org/
* contributed by Klaus Friedel
* converted to Groovy by Danno Ferrin
*/
import java.util.concurrent.locks.LockSupport;
public static class MessageThread extends Thread {
MessageThread nextThread;
volatile Integer message;
public MessageThread(MessageThread nextThread, int name) {
super(""+name);
this.nextThread = nextThread;
}
public void run() {
while(true) nextThread.enqueue(dequeue());
}
public void enqueue(Integer hopsRemaining) {
if(hopsRemaining == 0){
System.out.println(getName());
System.exit(0);
}
// as only one message populates the ring, it's impossible
// that queue is not empty
message = hopsRemaining - 1;
LockSupport.unpark(this); // work waiting...
}
private Integer dequeue(){
while(message == null){
LockSupport.park();
}
Integer msg = message;
message = null;
return msg;
}
}
int THREAD_COUNT = 503;
int hopCount = Integer.parseInt(args[0]);
MessageThread first = null;
MessageThread last = null;
for (int i = THREAD_COUNT; i >= 1 ; i--) {
first = new MessageThread(first, i);
if(i == THREAD_COUNT) last = first;
}
// close the ring:
last.nextThread = first;
// start all Threads
MessageThread t = first;
t.start();
t = t.nextThread;
while(t != first) {
t.start();
t = t.nextThread;
}
// inject message
first.enqueue(hopCount);
first.join(); // wait for System.exit