我正在寻找使线程执行超时的方法,并在以下示例中找到:https://stackoverflow.com/a/16231834/10015830
Future<?> future = service.submit(new MyCallable());
try {
future.get(100, TimeUnit.MILLISECONDS);
} catch (Exception e){
e.printStackTrace();
future.cancel(true); //this method will stop the running underlying task
}
但是我的需要与上面的示例不同:我不希望父线程在future.get
被阻塞。换句话说,我不需要获取可调用对象的结果。因为在我的实际应用程序中,父线程是定期执行的(scheduled
任务是周期5秒)。
有没有一种方法可以在不使用future.get
且不阻塞父线程的情况下使线程超时? (似乎invokeAll
也正在阻止)。
答案 0 :(得分:1)
您可以从计时器任务中取消长时间运行的任务:
import java.util.Timer;
import java.util.TimerTask;
Timer timer = new Timer();
Future<?> future = service.submit(new MyCallable());
TimerTask controlTask = new TimerTask(){
@Override
public void run() {
if (!future.isDone()) {
future.cancel(true);
}
}
};
long delay = 100;
timer.schedule(task, delay);