在java中只运行一分钟的线程

时间:2012-06-23 13:44:23

标签: java concurrency

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

3 个答案:

答案 0 :(得分:3)

这取决于你想要达到的目标,但一般来说,你从一开始就测量时间的方法并没有错。

答案 1 :(得分: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();
    }
}

...这是Hovercraft描述的,除了使用中断而不是ad-hoc标志。使用中断的优点是某些I / O调用被中断解除阻塞,一些库会尊重它。

答案 2 :(得分:2)

我很惊讶(并且非常失望)没有人提到Executors framework。它已经篡夺了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);