package test.timerqueue; import java.util.Calendar; import java.util.Properties; import org.jacorb.util.TimerQueue; import org.jacorb.util.TimerQueueAction; import org.jacorb.orb.ORB; public class Test { public TimerQueue tq; private ORB orb; private int threadcount = 0; public class TestAction extends TimerQueueAction { private int id; public TestAction (long duration, int ident) { super(duration); id = ident; } public void expire () { System.out.println ("TestAction[" + id + "].expire called on thread[" + Thread.currentThread().getId() + "] at " + nowstr()); } } public class TestNotifyWaiter extends Thread { public Object sync = null; private TimerQueueAction act; private int id; public TestNotifyWaiter (long duration, int ident) { id = ident; sync = new Object(); act = new TimerQueueAction (duration, sync); start(); } public TestNotifyWaiter (TestAction action) { id = 0; act = action; start(); } public void cancel () { tq.remove (act); } public void run () { long tid = Thread.currentThread().getId(); if (sync == null) { tq.add(act); System.out.println ("Thread[" + tid + "] not waiting, action should fire independently"); return; } synchronized (sync) { System.out.println ("Thread[" + tid + "] entering wait for id = " + id + " at " + nowstr()); tq.add(act); try { sync.wait(); } catch (InterruptedException ex) { System.out.println ("Thread[" + tid + "] interrupted"); } System.out.println ("Thread[" + tid + "] finishing for id = " + id + " at " + nowstr()); } } } public static String nowstr () { Calendar c = Calendar.getInstance(); String result = "" + c.get(Calendar.HOUR) + ":" + c.get(Calendar.MINUTE) + ":" + c.get(Calendar.SECOND) + "."; int msec = 1000 + c.get(Calendar.MILLISECOND); String msecStr = Integer.toString(msec); result += msecStr.substring(1); return result; } public void setUp() throws Exception { Properties props = new Properties (); props.setProperty ("jacorb.use_timer_queue", "on"); threadcount = Thread.activeCount(); orb = (ORB) ORB.init(new String[0], props); tq = orb.getTimerQueue(); } public void runTest () { System.out.println ("Starting test at " + nowstr()); TestNotifyWaiter waiters[] = new TestNotifyWaiter[10]; long dur = 1000; for (int i = 0; i < 5; i++) { waiters[i] = new TestNotifyWaiter (dur, i+1); dur += 500; waiters[i+5] = new TestNotifyWaiter ( new TestAction(dur, i+6)); dur += 500; } try { Thread.sleep (10); System.out.println ("All threads started at " + nowstr()); int active = Thread.activeCount() - threadcount; System.out.println ("Active thread count is " + active + " wait count = " + tq.depth()); Thread.sleep (1000); waiters[9].cancel(); waiters[8].cancel(); Thread.sleep (10); System.out.println ("After canceling wait count = " + tq.depth()); Thread.sleep (5000); System.out.println ("Test exiting at " + nowstr()); orb.shutdown(true); active = Thread.activeCount() - threadcount; System.out.println ("stuck threads = " + active); } catch( InterruptedException ex ) { ex.printStackTrace(); } finally { tq.halt(); } } public static void main( String args[] ) { Test c = new Test(); try { c.setUp(); c.runTest(); } catch( Exception ex ) { ex.printStackTrace(); } } }