Multithreading 终止Spring调度线程

Multithreading 终止Spring调度线程,multithreading,spring,scheduling,kill,Multithreading,Spring,Scheduling,Kill,如果由于远程资源不可用,任务需要很长时间甚至挂起,那么Spring中的计划任务(杀死线程)是否会超时 在我的例子中,任务可能会花费太长甚至挂起,因为它们基于HtmlUnitDriver(Selenium)的步骤序列,但有时它会挂起,我希望能够设置线程执行的时间限制。最多1分钟左右 我设置了5分钟的固定速率执行,初始延迟为1分钟 提前感谢参见: 简单的回答是,由于Java线程实现的局限性,没有简单可靠的方法杀死线程。执行器服务#shutdown()。最好在任务本身中处理此问题,例如,如果您在套接字

如果由于远程资源不可用,任务需要很长时间甚至挂起,那么Spring中的计划任务(杀死线程)是否会超时

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

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

提前感谢

参见:

简单的回答是,由于Java线程实现的局限性,没有简单可靠的方法杀死线程。执行器服务#shutdown()。最好在任务本身中处理此问题,例如,如果您在套接字上发出REST请求超时,则在网络请求级别处理此问题

或者,如果您通过一个演员模型传递某种消息(请参阅),您可以从“主管”发送消息,让演员死亡。另外,使用Netty之类的工具避免阻塞也会有所帮助。

请参阅:

简单的回答是,由于Java线程实现的局限性,没有简单可靠的方法杀死线程。执行器服务#shutdown()。最好在任务本身中处理此问题,例如,如果您在套接字上发出REST请求超时,则在网络请求级别处理此问题


或者,如果您通过一个演员模型传递某种消息(请参阅),您可以从“主管”发送消息,让演员死亡。另外,使用Netty之类的工具避免阻塞也会有所帮助。

我不久前也做了同样的事情,如下示例所示:

基本思想是将代码放在一个实现Callable或Runnable的类中,然后创建一个FutureTask,无论您将在何处使用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();
CallableServiceExecutor CallableServiceExecutor=新的CallableServiceExecutor();
FutureTask task=新的FutureTask(callableServiceExecutor);
ExecutorService executor=Executors.newSingleThreadExecutor();
执行人提交(任务);
布尔值exito=true;
试一试{
结果=task.get(getTimeOutValidAction(),TimeUnit.SECONDS);
}捕捉(中断异常e){
exito=假;
}捕获(执行例外){
exito=假;
}捕获(超时异常e){
exito=假;
}
任务。取消(true);
executor.shutdown();

我不久前也做了同样的事情,如下示例所示:

基本思想是将代码放在一个实现Callable或Runnable的类中,然后创建一个FutureTask,无论您将在何处使用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();
CallableServiceExecutor CallableServiceExecutor=新的CallableServiceExecutor();
FutureTask task=新的FutureTask(callableServiceExecutor);
ExecutorService executor=Executors.newSingleThreadExecutor();
执行人提交(任务);
布尔值exito=true;
试一试{
结果=task.get(getTimeOutValidAction(),TimeUnit.SECONDS);
}捕捉(中断异常e){
exito=假;
}捕获(执行例外){
exito=假;
}捕获(超时异常e){
exito=假;
}
任务。取消(true);
executor.shutdown();

你解决问题了吗?你解决问题了吗?非常感谢Luciano,我会尝试一下,然后再回来告诉你一个重要的区别是I0m使用带有@Async注释的Spring,所以我不能完全控制线程初始化和触发器,但这给了我一个关于主执行器线程的线索,手动运行所有子线程,可能在特定时间睡觉,然后杀死仍然活着的人。保持控制才是最重要的。我很高兴它起到了作用,我遇到了一个类似的问题,这就是我解决它的方法。你好,卢西亚诺,它终于起作用了,但只知道可调用任务必须正确处理中断的异常,才能从任务返回到主执行流,或者抛出一个InterruptedException。我通过正常的单线程执行器服务实现。非常感谢您的帮助。非常感谢Luciano,我会尝试一下,然后回来告诉您一个重要的区别是I0m使用Spring和@Async注释,所以我不能完全控制线程初始化和触发器,但这给了我一个关于主执行器线程的线索,手动运行所有子线程,可能在特定时间睡觉,然后杀死仍然活着的人。保持控制才是最重要的。我很高兴它起到了作用,我遇到了一个类似的问题,这就是我解决它的方法。你好,卢西亚诺,它终于起作用了,但只知道可调用任务必须正确处理中断的异常,才能从任务返回到主执行流,或者抛出一个InterruptedException。我通过正常的单线程执行器服务实现。非常感谢你的帮助。