杀春季调度线程
问题描述:
反正是有超时计划任务(杀线程)在春季,如果任务需要长期甚至挂起,因为远程资源不可用杀春季调度线程
在我的情况下,任务可以花费太长的时间,甚至挂起是因为它们基于HtmlUnitDriver(Selenium)步骤序列,但它会不时挂起,我希望能够为要执行的线程设置时间限制。最多1分钟。
我设置5分钟的固定费率执行,初始延迟1分钟。
在此先感谢
答
简短的答案是,有没有简单的或可靠的方式来杀死一个线程由于Java的线程执行的限制。 ExecutorService#shutdown()
是一种黑客和沉重。它最好在任务本身中处理这个问题,例如就像在网络请求级别,如果您在套接字上发出REST请求超时。
或者,如果您执行某种类型的消息传递ala Actor模型(请参阅Akka),您可以发送一条来自“主管”的消息,以使Actor死亡。同时避免使用类似Netty的阻塞会有所帮助。
答
我也做了同样前段时间下面这个例子:example
的基本思想是把你的代码在一个类实现可赎回或可运行状态,然后创建一个FutureTask无论你打算用给invoque你的线程Callable或Runnable类作为参数。定义一个执行器,将你的FutureTask提交给执行器,现在你可以在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();
你解决这个问题? – Luciano 2013-03-15 13:47:38