/* The Great Computer Language Shootout http://shootout.alioth.debian.org/ contributed by Isaac Gouy */ public class process { public static void main(String args[]) { int n = Integer.parseInt(args[0]); EndLink chainEnd = new EndLink(null, n); chainEnd.start(); Link chain = chainEnd; for (int i=2; i<=n; i++){ Link link = new Link(chain); link.start(); chain = link; } chain.put(0); try { chainEnd.join(); } catch (InterruptedException e){} System.out.println(chainEnd.count); System.exit(0); } } class Link extends Thread { Link next; int message = -1; boolean busy = false; Link(Link t){ next = t; } public void run() { for (;;) next.put(this.take()); } synchronized void put(int m) { while (busy) try { wait(); } catch (InterruptedException e){} busy = true; message = m; notifyAll(); while (message != -1) try { wait(); } catch (InterruptedException e){} busy = false; notifyAll(); } synchronized int take() { while (message == -1) try { wait(); } catch (InterruptedException e){} int m = message; message = -1; notifyAll(); return m+1; } } class EndLink extends Link { public int count = 0; private int finalcount; EndLink(Link t, int i){ super(t); finalcount = i; } public void run() { do count += this.take(); while (count < finalcount); } } // vim: set ts=4 ft=java