Java如何在不使用future.get且不阻止父线程的情况下使线程超时

时间:2019-04-07 16:11:02

标签: java multithreading

我正在寻找使线程执行超时的方法,并在以下示例中找到: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也正在阻止)。

1 个答案:

答案 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);