在Java中,有一种理智的方式让线程/任务连续运行,然后在指定的运行时间后结束(最好不使用多个计时器)?
例如,如果我有一个TimerTask,似乎没有办法安排该任务在一定的毫秒数后或在Timer类的特定时间结束
当然,我可以在几毫秒之后将任务安排到repeat,但是如果我希望它在一次迭代后结束呢?我必须在此计划任务中运行另一个计时器?我希望得到比这更优雅的答案。
this question中提供的答案可行,但绝对不是我想到的。
基本上,我正在寻找类似于C#System.Timers.Timer
类
答案 0 :(得分:1)
只需创建另一个线程,并在需要其他线程停止时让它计时:
class ThreadTimer implements Runnable {
public void run()
{
Thread.sleep(3000);
MainThread.stopThread();
}
}
class MainThread implements Runnable {
public boolean running = true;
public void run()
{
// thread running code
if(!running)
return;
}
public static void stopThread()
{
running = false;
}
}
其中3000
是您希望线程停止的时间量(以毫秒为单位)。
由于Java中不推荐使用Thread.stop()
,因此下一个最佳方法是仅在布尔值设置为true时才执行该线程。当您调用停止线程时,您将该布尔值设置为false,从而使线程中的代码不运行。
因为void run()不重复自身并且只执行一次,所以如果将boolean设置为false,它只返回run()
并停止线程的执行。
答案 1 :(得分:1)
你可以使用ExecutorService
,在你想要的时间之后抓住你得到的Future
和.cancel()
:
final Future<Whatever> f = executor.submit(...);
TimeUnit.SECONDS.sleep(xxx);
f.cancel(true);
或者你可以有两个服务:一个执行,另一个使用ScheduledExecutorService
进行取消。
注意:TimerTask
取决于系统时间,请改用ScheduledExecutorService
。
答案 2 :(得分:0)
如果您的任务在循环中运行,您可以检查每次迭代的当前时间,并在有足够的时间过去时终止循环。
或者,如果您的任务涉及睡眠,您可以在另一个线程上设置一个计时器,以便在任务上调用Thread.interrupt
。
唯一的另一个选择是在另一个线程上设置一个定时器来调用Thread.stop
。但是,Thread.stop
has been deprecated,并且没有安全的方法来阻止Java中的常规线程。