Java - 在TimeoutException之后正确取消线程的执行

时间:2017-06-07 07:52:10

标签: java multithreading future

我有一个java程序,它按计划运行,并通过RFC调用从外部源获取一些数据。 RFC调用是有线程的,应在60秒后取消。我就是这样做的:

Future<String> future = executor.submit(new MyCallable());
try {
    future.get(60, TimeUnit.SECONDS);
} catch (TimeoutException e) {
    future.cancel(true);
}

这工作了很长时间,直到我遇到一种情况,外部RFC调用卡住了,future.cancel(true)无法中断线程执行。所以我的java程序从未完成并继续运行,直到我手动取消外部系统中的相应进程。

我现在的问题是,如何在任何情况下保证代码完成?我看到停止线程已被折旧。

这样做是不是一个好主意?

try {
     future.get(60, TimeUnit.SECONDS);
} catch (TimeoutException e) {
     future.cancel(true);
     if(!future.isDone()){
        System.exit(1);
     }
}

感谢你提出任何想法。

干杯,Jooo

1 个答案:

答案 0 :(得分:0)

我相信如果在执行过程中没有实现InterruptedException,那么在Java中就没有办法杀死一个线程。如果线程正在执行,它只是设置一个标志,并由线程注意它。如果线程正在等待或正在休眠,它将抛出InterruptedException。

当然,无需在每一行之后进行检查,但是可能需要很长时间才能执行的方法负责正确处理中断

终止线程正在运行的进程。 (例如,调用System.exit(int)。)