仅在一段时间内运行线程的最佳做法是什么?我可以很容易地检查curentTime并在工作一段时间后关闭线程,但我认为这不是正确的方法。
问问题
2705 次
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 回答