| /* 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(); |
| } |
| } |
| } |