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.
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();
}
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With