/* The Computer Language Benchmarks Game http://shootout.alioth.debian.org/ contributed by Mattias Bergander */ import java.util.LinkedList; import java.util.List; public class message { public static final int numberOfThreads = 500; public static int numberOfMessagesToSend; public static void main(String args[]) { numberOfMessagesToSend = Integer.parseInt(args[0]); MessageThread chain = null; for (int i = 0; i < numberOfThreads; i++) { chain = new MessageThread(chain); new Thread(chain).start(); } for (int i = 0; i < numberOfMessagesToSend; i++) { chain.enqueue(new MutableInteger(0)); } } } class MutableInteger { int value; public MutableInteger() { this(0); } public MutableInteger(int value) { this.value = value; } public MutableInteger increment() { value++; return this; } public int intValue() { return value; } } class MessageThread implements Runnable { MessageThread nextThread; List<MutableInteger> list = new LinkedList<MutableInteger>(); MessageThread(MessageThread nextThread) { this.nextThread = nextThread; } public void run() { if (nextThread != null) { while (true) { nextThread.enqueue(dequeue()); } } else { int sum = 0; int finalSum = message.numberOfThreads * message.numberOfMessagesToSend; while (sum < finalSum) { sum += dequeue().intValue(); } System.out.println(sum); System.exit(0); } } /** * @param message */ public void enqueue(MutableInteger message) { synchronized (list) { list.add(message); if (list.size() == 1) { list.notify(); } } } public MutableInteger dequeue() { synchronized (list) { while (list.size() == 0) { try { list.wait(); } catch (InterruptedException e) { } } return list.remove(0).increment(); } } }