thread-ring Java #3 program
source code
/**
* The Computer Language Benchmarks Game
* http://benchmarksgame.alioth.debian.org/
* contributed by Klaus Friedel
*/
import java.util.concurrent.locks.LockSupport;
public class threadring {
static final int THREAD_COUNT = 503;
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;
}
}
public static void main(String args[]) throws Exception{
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;
do{
t.start();
t = t.nextThread;
}while(t != first);
// inject message
first.enqueue(hopCount);
first.join(); // wait for System.exit
}
}
notes, command-line, and program output
NOTES:
64-bit Ubuntu quad core
java 10 2018-03-20
Java(TM) SE Runtime Environment 18.3 (build 10+46)
Java HotSpot(TM) 64-Bit Server VM 18.3 (build 10+46, mixed mode)
Wed, 21 Mar 2018 18:47:33 GMT
MAKE:
mv threadring.java-3.java threadring.java
/opt/src/jdk-10/bin/javac -d . threadring.java
1.09s to complete and log all make actions
COMMAND LINE:
/opt/src/jdk-10/bin/java threadring 50000000
PROGRAM OUTPUT:
292