0

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

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

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

这个问题中提供的答案可能有效,但这绝对不是我的想法。

本质上,我正在寻找类似于C#类的AutoReset属性的东西System.Timers.Timer

4

3 回答 3

2

只需创建另一个线程并让它为它希望其他线程停止的时间安排时间:

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从您希望线程停止的时间开始,以毫秒为单位的时间量在哪里。

由于Thread.stop()在 Java 中已弃用,下一个最佳方法是仅在布尔值设置为 true 时才执行线程。当您调用停止线程时,您将该布尔值设置为 false,从而使线程中的代码不运行。

因为 void run() 不会重复自身并且只执行一次,如果将布尔值设置为 false,它只会返回run()并停止线程的执行。

于 2013-07-24T03:27:01.707 回答
2

您可以使用ExecutorService,在您想要的时间之后抓住Future您得到的和.cancel()它:

final Future<Whatever> f = executor.submit(...);
TimeUnit.SECONDS.sleep(xxx);
f.cancel(true);

或者你可以有两个服务:一个执行,另一个使用 aScheduledExecutorService来取消。

注意:TimerTask取决于系统时间,请使用 aScheduledExecutorService代替。

于 2013-07-24T03:38:45.017 回答
0

如果您的任务在循环中运行,您可以在每次迭代时检查当前时间,如果经过足够的时间,则终止循环。

或者,如果您的任务涉及睡眠,您可以在另一个线程上设置一个计时器来调用Thread.interrupt该任务。

唯一的其他选择是在另一个线程上设置一个计时器来调用Thread.stop. 但是,Thread.stop 已弃用,并且没有安全的方法来停止 Java 中的一般线程。

于 2013-07-24T03:21:35.413 回答