// Many threads join a single thread. class Sleeper implements Runnable { int num = -1; public Sleeper(int num) { this.num = num; } public void run() { System.out.println("sleeping"); try { Thread.sleep(500); } catch (InterruptedException x) { System.out.println("sleep() interrupted"); } System.out.println("done"); } } class Joiner implements Runnable { Thread join_target; public Joiner(Thread t) { this.join_target = t; } public void run() { try { long start = System.currentTimeMillis(); join_target.join(2000); if ((System.currentTimeMillis() - start) > 1900) System.out.println("Error: Join timed out"); else System.out.println("ok"); } catch (InterruptedException x) { System.out.println("join() interrupted"); } } } public class Thread_Join { public static void main(String[] args) { Thread primary = new Thread(new Sleeper(1)); primary.start(); for (int i=0; i < 10; i++) { Thread t = new Thread(new Joiner(primary)); t.start(); } } }