Java:指定的毫秒后线程/任务到期

时间:2013-07-24 03:16:51

标签: java multithreading concurrency scheduled-tasks timertask

在Java中,有一种理智的方式让线程/任务连续运行,然后在指定的运行时间后结束(最好不使用多个计时器)?

例如,如果我有一个TimerTask,似乎没有办法安排该任务在一定的毫秒数后或在Timer类的特定时间结束

当然,我可以在几毫秒之后将任务安排到repeat,但是如果我希望它在一次迭代后结束呢?我必须在此计划任务中运行另一个计时器?我希望得到比这更优雅的答案。

this question中提供的答案可行,但绝对不是我想到的。

基本上,我正在寻找类似于C#System.Timers.Timer

上的AutoReset属性的内容

3 个答案:

答案 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中的常规线程。