/* Copyright (c) 2006, Sriram Srinivasan * * You may distribute this software under the terms of the license * specified in the file "License" */ package kilim.bench; public class ThreadBench extends Thread { ThreadBench next; int val = -1; // This value is filled by the previous process before this process is public static boolean tracing = false; static long startTime; public static void main(String[] args) { int n = 500; int k = 10000; try { for (int i = 0; i < args.length; i++) { String arg = args[i]; if (arg.equals("-k")) { k = Integer.parseInt(args[++i]); } else if (arg.equals("-n")) { n = Integer.parseInt(args[++i]); } else if (arg.equals("-t")) { tracing = true; } } } catch (NumberFormatException e) { System.err.println("Integer argument expected"); } startTime = System.currentTimeMillis(); bench(k, n); } static void bench(int k, int n) { Sink sink = new Sink(); ThreadBench next = sink; for (int i = n; i >= 1; i--) { next.start(); next = new Copy(i, next); } next.start(); Source source = new Source(k, next); sink.source = source; source.start(); try { source.join(); } catch (InterruptedException ie) {} System.out.println("Done"); } ThreadBench() { } synchronized void write(int v) { while (val != -1) { try { wait(); } catch (InterruptedException ie) {ie.printStackTrace();} } val = v; notify(); } synchronized int read() { while (val == -1) { try { wait(); } catch (InterruptedException ie) {ie.printStackTrace();} } int v = val; val = -1; notify(); return v; } static class Copy extends ThreadBench { int id; // woken up Copy(int aid, ThreadBench p) { id = aid; next = p; } public void run() { while (true) { int v = read(); if (tracing) System.out.println(this.toString() + " copying number " + v); next.write(v); if (v == 0) break; } } public String toString() {return "copy " + id;} } static class Sink extends ThreadBench { ThreadBench source; public void run() { int v; int i = 0; while (true) { v = read(); i++; if(tracing) System.out.printf("sink: receiving number %d\n-----\n", v); if (v == 0) { System.out.println("Elapsed time: " + (System.currentTimeMillis() - startTime) + " ms, iterations = " + i); System.exit(0); } } } public String toString() {return "sink";} } static class Source extends ThreadBench { int loops; Source(int k, ThreadBench p) { loops = k; next = p; } public void run() { for (int i = 1; i <= loops; i++) { if(tracing) System.out.printf("source: sending number %d\n", i); next.write(i); } // Kill next.write(0); } public String toString() {return "source";} } }