如果由于远程资源不可用而导致任务花费很长时间甚至挂起,是否有超时任务(杀死线程)?
就我而言,任务可能需要太长时间甚至挂起,因为它们基于 HtmlUnitDriver (Selenium) 步骤序列,但有时它会挂起,我希望能够设置线程执行的时间限制. 最多1分钟左右。
我设置了 5 分钟的固定速率执行,初始延迟为 1 分钟。
提前致谢
如果由于远程资源不可用而导致任务花费很长时间甚至挂起,是否有超时任务(杀死线程)?
就我而言,任务可能需要太长时间甚至挂起,因为它们基于 HtmlUnitDriver (Selenium) 步骤序列,但有时它会挂起,我希望能够设置线程执行的时间限制. 最多1分钟左右。
我设置了 5 分钟的固定速率执行,初始延迟为 1 分钟。
提前致谢
前段时间我按照这个例子做了同样的事情:example
基本思想是将代码放在实现 Callable 或 Runnable 的类中,然后在要调用线程的任何地方创建一个 FutureTask,并将 Callable 或 Runnable 类作为参数。定义一个 executor ,将你的 futureTask 提交给 executor,现在你可以在 try catch 块内执行线程 x 时间,如果你的线程以 timeoutException 结束,你就会知道它花费了太长时间。
这是我的代码:
CallableServiceExecutor callableServiceExecutor = new CallableServiceExecutor();
FutureTask<> task = new FutureTask<>(callableServiceExecutor);
ExecutorService executor = Executors.newSingleThreadExecutor();
executor.submit(task);
Boolean exito = true;
try {
result = task.get(getTimeoutValidacion() , TimeUnit.SECONDS);
} catch (InterruptedException e) {
exito = false;
} catch (ExecutionException e) {
exito = false;
} catch (TimeoutException e) {
exito = false;
}
task.cancel(true);
executor.shutdown();
请参阅:如何使线程超时
简短的回答是,由于 Java 线程实现的限制,没有简单或可靠的方法来杀死线程。这ExecutorService#shutdown()
是一种黑客和沉重的。最好在任务本身中处理这个问题,例如在网络请求级别,如果您发出 REST 请求以在套接字上超时。
或者更好的是,如果您通过 ala Actor 模型(请参阅Akka )进行某种消息传递,您可以从“主管”发送消息让 Actor 死亡。通过使用像 Netty 这样的东西来避免阻塞也会有所帮助。