I need to run some code for a predefined length of time, when the time is up it needs to stop. Currently I am using a TimerTask to allow the code to execute for a set amount of time but this is causing endless threads to be created by the code and is just simply not efficient. Is there a better alternative?
Current code;
// Calculate the new lines to draw
Timer timer3 = new Timer();
timer3.schedule(new TimerTask(){
public void run(){
ArrayList<String> Coords = new ArrayList<String>();
int x = Float.valueOf(lastFour[0]).intValue();
int y = Float.valueOf(lastFour[1]).intValue();
int x1 = Float.valueOf(lastFour[2]).intValue();
int y1 = Float.valueOf(lastFour[3]).intValue();
//Could be the wrong way round (x1,y1,x,y)?
Coords = CoordFiller.coordFillCalc(x, y, x1, y1);
String newCoOrds = "";
for (int j = 0; j < Coords.size(); j++)
{
newCoOrds += Coords.get(j) + " ";
}
newCoOrds.trim();
ClientStorage.storeAmmendedMotion(newCoOrds);
}
}
,time);
If you are using Java5 or later, consider ScheduledThreadPoolExecutor
and Future
. With the former, you can schedule tasks to be run after a specified delay, or at specified intervals, thus it takes over the role of Timer
, just more reliably.
The
Timer
facility manages the execution of deferred ("run this task in 100 ms") and periodic ("run this task every 10 ms") tasks. However,Timer
has some drawbacks, andScheduledThreadPoolExecutor
should be thought of as its replacement. [...]A
Timer
creates only a single thread for executing timer tasks. If a timer task takes too long to run, the timing accuracy of otherTimerTask
s can suffer. If a recurringTimerTask
is scheduled to run every 10 ms and anotherTimerTask
takes 40 ms to run, the recurring task either (depending on whether it was scheduled at fixed rate or fixed delay) gets called four times in rapid succession after the long-running task completes, or "misses" four invocations completely. Scheduled thread pools address this limitation by letting you provide multiple threads for executing deferred and periodic tasks.Another problem with
Timer
is that it behaves poorly if aTimerTask
throws an unchecked exception. TheTimer
thread doesn't catch the exception, so an unchecked exception thrown from aTimerTask
terminates the timer thread.Timer
also doesn't resurrect the thread in this situation; instead, it erroneously assumes the entireTimer
was cancelled. In this case,TimerTask
s that are already scheduled but not yet executed are never run, and new tasks cannot be scheduled.
From Java Concurrency in Practice, section 6.2.5.
And Future
s can be constrained to run at most for the specified time (throwing a TimeoutException
if it could not finish in time).
If you don't like the above, you can make the task measure its own execution time, as below:
int totalTime = 50000; // in nanoseconds
long startTime = System.getNanoTime();
boolean toFinish = false;
while (!toFinish)
{
System.out.println("Task!");
...
toFinish = (System.getNanoTime() - startTime >= totalTime);
}
[...] Currently I am using a TimerTask to allow the code to execute for a set amount of time [...]
The timer task will never stop the currently running task. In fact, it's only purpose is to restart the task over and over again.
There is no easy way of solving this without tight cooperation with the executing task. The best way is to let the task monitor it's own execution, and make sure that it returns (terminates) when its time is up.
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