在一段时间内运行线程的最佳做法是什么? 我可以轻松检查curentTime并在工作一段时间后关闭线程,但我认为这不是正确的方法。
答案 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);