0

仅在一段时间内运行线程的最佳做法是什么?我可以很容易地检查curentTime并在工作一段时间后关闭线程,但我认为这不是正确的方法。

4

3 回答 3

3

这取决于您想要实现的目标,但一般来说,您提到的从一开始就测量时间的方法并没有那么错误。

于 2012-06-23T14:17:21.323 回答
2

我会这样编码:

private static class MyTimerTask extends TimerTask {
    private final Thread target;
    public MyTimerTask(Thread target) { this.target = target; }
    public void run() {
        target.interrupt();
    }
}

public void run() {
    Thread final theThread = Thread.currentThread();
    Timer timer = new Timer();
    try {
         timer.schedule(new MyTimerTask(theThread), 60000});
         while(!theThread.interrupted()) {
             ....
         }
    } finally {
         timer.cancel();
    }
}

...这是气垫船描述的,除了使用中断而不是临时标志。使用中断的好处是一些 I/O 调用不会被中断阻塞,一些库会尊重它。

于 2012-06-23T15:24:40.687 回答
2

我很惊讶(也很失望)没有人提到Executors 框架。它篡夺了 Timer 框架(或至少是java.util.Timer类)作为计划任务的“goto”。

例如,

// Start thread
final Thread t = new Thread(new Runnable(){
    @Override
    public void run(){
        while(!Thread.currentThread().isInterrupted()){
            try{
                // do stuff
            }
            catch(InterruptedException e){
                Thread.currentThread().interrupt();
            }
        }
    }
});
t.start();

// Schedule task to terminate thread in 1 minute
ScheduledExecutorService exec = Executors.newSingleThreadScheduledExecutor();
exec.schedule(new Runnable(){
    @Override
    public void run(){
        t.interrupt();
    }
}, 1, TimeUnit.MINUTES);
于 2012-06-23T16:10:31.663 回答