Reputation: 131
So I'm trying to figure out how to create a timer, I came across this: using ScheduledExecutorService to start and stop timer
The example they have seems to work pretty well. I'm just wondering if I'm utilizing this correctly:
public class TimerTest
{
private ScheduledExecutorService es = null;
private boolean timeIsUp = false;
private ScheduledFuture futureHandler = null;
private TimeKeeper timeKeeper = null;
private String subject = "";
private int siteNo;
private long time;
private boolean stop;
public void endTimer()
{
System.out.println("we should shutdown everything here");
es.shutdownNow();
}
public boolean stopTimer()
{
if (timeKeeper != null)
{
timeKeeper.deactivate();
}
futureHandler.cancel(true);
return true;
}
public boolean isTimeup()
{
return timeKeeper.isTimeUp();
}
public void startTimer(long mseconds, String subj, int sNo)
{
subject = subj;
siteNo = sNo;
time = mseconds;
timeKeeper = new TimeKeeper();
callScheduler(mseconds);
}
public boolean isTimerRunning()
{
return (es.isShutdown() || es == null);
}
public void resetTimer(long t)
{
stopTimer();
callScheduler(t);
}
public void resetTimer()
{
resetTimer(time);
}
private void callScheduler(long mseconds)
{
if (es == null)
es = Executors.newScheduledThreadPool(3);
timeKeeper = new TimeKeeper();
futureHandler = es.schedule( timeKeeper, mseconds, TimeUnit.MILLISECONDS);
}
private class TimeKeeper implements Runnable {
//volatile for thread-safety
private volatile boolean isActive = true;
private volatile boolean isTimeUp = false;
public void run () {
if (isActive){
callAlert();
isTimeUp = true;
}
}
public void deactivate(){
isActive = false;
}
public boolean isTimeUp()
{
return isTimeUp;
}
private void callAlert()
{
System.out.println("you are in the callAlert method");
}
}
}
And here is the Test:
public static void main(String[] args) {
// TODO Auto-generated method stub
long pastTime = System.currentTimeMillis();
TimerTest timer = new TimerTest();
timer.startTimer(15000, "bh", 1);
long time;
int count =0;
boolean stop = false;
while(true)
{
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
time = System.currentTimeMillis() - pastTime;
if (time > 3000)
{
if (!stop){
System.out.println("we are reseting the timer");
timer.resetTimer(4000);
timer.stopTimer();
try {
Thread.sleep(3995);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
break;
}
stop = true;
}
if (timer.isTimeup())
{
System.out.println("our time is up");
timer.endTimer();
break;
}
if (!stop)
System.out.println("hello");
else
{
if (count == 0)
System.out.println("we wait 10 seconds from now");
count++;
}
}
timer.resetTimer(1200);
while (true)
{
if (timer.isTimeup())
{
timer.isTimeup();
System.out.println("breaking after time is up");
break;
}
}
timer.endTimer();
}
This seems to work, I'm might of missed something that I need, this is my first time working with the ScheduledExecutorService Do you guys see any problems with this code? I don't want there to be conflict with thread collision.
Upvotes: 7
Views: 12954
Reputation: 2102
With ScheduledExecutorService you automatically get the timer feature. You don't need it explicitly unless you have something that the ScheduleExecutorService can't provide. e.g. Let say you want to start a task after initial delay of 10 secs and then subsequent delays of 5 seconds each.
public void init() {
executor = new ScheduledThreadPoolExecutor(corePoolSize);
executor.scheduleWithFixedDelay(new WorkerThread(), 10, 5, TimeUnit.SECONDS);
}
public void end() {
executor.shutdown();
}
Upvotes: 5