1

如果由于远程资源不可用而导致任务花费很长时间甚至挂起,是否有超时任务(杀死线程)?

就我而言,任务可能需要太长时间甚至挂起,因为它们基于 HtmlUnitDriver (Selenium) 步骤序列,但有时它会挂起,我希望能够设置线程执行的时间限制. 最多1分钟左右。

我设置了 5 分钟的固定速率执行,初始延迟为 1 分钟。

提前致谢

4

2 回答 2

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();
于 2013-03-13T17:11:55.943 回答
0

请参阅:如何使线程超时

简短的回答是,由于 Java 线程实现的限制,没有简单或可靠的方法来杀死线程。这ExecutorService#shutdown()是一种黑客和沉重的。最好在任务本身中处理这个问题,例如在网络请求级别,如果您发出 REST 请求以在套接字上超时。

或者更好的是,如果您通过 ala Actor 模型(请参阅Akka )进行某种消息传递,您可以从“主管”发送消息让 Actor 死亡。通过使用像 Netty 这样的东西来避免阻塞也会有所帮助。

于 2013-03-13T16:58:43.953 回答