2

我有一个烦人的问题。现在,我有一段代码可以启动一个线程,在该线程中设置一个计时器,然后退出该线程并继续其生命。我的意图是让程序在继续代码流之前等待 TimerTask 完成。然而,显然,设置一个新的 TimerTask 并不会暂停执行以等待计时器运行完毕。

我该如何设置,以便我的代码到达 TimerTask,等待 TimerTask 过期,然后继续?我什至应该使用计时器吗?我到处寻找解决方案,但似乎找不到。

timer = new Timer();
    Thread t = new Thread(new Runnable(){
        boolean isRunning = true;
        public void run() {
            int delay = 1000;
            int period = 1000;
            interval = 10;
            timerPanel.setText(interval.toString());

            //Scheduling the below TimerTask doesn't wait
            //for the TimerTask to finish before continuing
            timer.scheduleAtFixedRate(new TimerTask() { 

                public void run() {
                    timerPanel.setText(setInterval().toString());
                }
            }, delay, period);

            System.out.println("Thread done.");
        }
    });
    t.start();

    try {
        t.join(); //doesn't work as I wanted
    } catch (InterruptedException e) {
        e.printStackTrace();
    }
    endTask();

提前致谢。

编辑:对于重复任务的困惑感到抱歉。我需要重复该任务,因为它是一个倒数计时器,每秒从 10 脉冲到 0。函数 setInterval() 最终取消了计时器。以下是相关代码:

private final Integer setInterval() {
    if (interval == 1)
        timer.cancel();
    return --interval;
}
4

3 回答 3

5

我相信CountDownLatch会做你想做的事。

final CountDownLatch latch = new CountDownLatch(10);
int delay = 1000;
int period = 1000;

timerPanel.setText(Long.toString(latch.getCount()));

timer = new Timer();
timer.scheduleAtFixedRate(new TimerTask() {
    public void run() {
        latch.countDown();
        timerPanel.setText(Long.toString(latch.getCount()));
    }
}, delay, period);

try {
    latch.await();
}
catch (InterruptedException e) {
    e.printStackTrace();
}

timer.cancel();
于 2014-10-09T12:54:17.403 回答
0

使用信号量。在声明定时器任务之前对其进行初始化,许可为 0。在计时器任务中,使用 try/finally 块来释放信号量。在主线程中,从信号量获取许可。

在您的代码中, join 按指定工作,因为它等待线程完成。不,没有必要为此使用线程。如果您真的想阻塞到某个时间,则不需要 Timer。获取当前时间,计算直到未来时间的毫秒,然后 sleep()。

于 2013-07-01T13:48:49.233 回答
0

您应该使用Thread.sleep函数而不是TimeTask停止执行。

TimerTask并不意味着停止执行,它就像一个在后台运行的时钟。因此,根据您的要求,您应该选择Thread.sleep.

于 2013-07-01T13:47:50.613 回答