package uk.co.mmscomputing.concurrent; public class Timer extends Semaphore{ private boolean waiting; protected int timeout; protected int delay; protected TimerListener listener; public Timer(int timeout){ super(0,true); this.timeout=timeout; } public void setDelay(int td){this.delay=td;} public void setListener(TimerListener listener){this.listener=listener;} public void acquire()throws InterruptedException{ waiting=true; new CountdownThread().start(); super.acquire(); waiting=false; } public boolean tryAcquire(long timeout,TimeUnit unit)throws InterruptedException{ waiting=true; new CountdownThread().start(); boolean r=super.tryAcquire(timeout,unit); waiting=false; return r; } class CountdownThread extends Thread{ public void run(){ int countdown=timeout; listener.begin(countdown); while(waiting){ try{ countdown-=delay; sleep(delay); listener.tick(countdown); }catch(InterruptedException e){} } listener.end(countdown); } } }