package console; class Useless { public static boolean b = true; public synchronized void u1(){ while(b == true){ try { wait(); }catch(InterruptedException i) { } } } public synchronized void u2() { if (b == true) { b = false; } notify(); } } public class SleepMessages extends Thread { private Useless u; private long time; public SleepMessages(Useless u, long time) { this.u=u; this.time=time; } public void run() { String importantInfo[] = { "Mares eat oats", "Does eat oats" }; for (int i = 0; i < importantInfo.length; i++) { u.u1(); System.out.println(importantInfo[i] + " - " + getName() + " " + (System.currentTimeMillis()-time) + "ms"); try { sleep(2000); } catch(InterruptedException e) {} } } public static void main(String args[]) throws InterruptedException { long time = System.currentTimeMillis(); Useless u = new Useless(); Thread t1 = new SleepMessages(u, time); t1.setName("t1"); Thread t2 = new SleepMessages(u, time); t2.setName("t2"); t1.start(); t2.start(); sleep(2000); System.out.println("Here they go!..." + (System.currentTimeMillis() - time) + "ms"); t1.interrupt(); sleep(1000); t2.interrupt(); u.u2(); sleep(1000); u.u2(); } }