如何使用 ThreadPoolTask​​Executor 为任务设置超时

Posted

技术标签:

【中文标题】如何使用 ThreadPoolTask​​Executor 为任务设置超时【英文标题】:How to set timeout for task using ThreadPoolTaskExecutor 【发布时间】:2017-04-27 06:07:56 【问题描述】:

使用ThreadPoolTaskExecutor 时是否可以使任务超时?我无法将ThreadPoolTaskExecutor 更改为ThreadPoolExecutorExecutorService

【问题讨论】:

使用Future.get(long, TimeUnit)? 【参考方案1】:

在向您的ThreadPoolTaskExecutor 提交Callable 后,您应该会收到Future。在这个Future 上,您可以使用TimeUnit 调用get(long timeout, TimeUnit unit) 函数,这是超时,程序将等待未来交付或继续运行的最长时间,通过抛出TimeoutException

ie(未经证实的伪代码)

Future myFuture = threadPoolTaskExecutor.submit(myCallable);
try 
    myResult = myFuture.get(5l,TimeUnit.SECONDS);
 catch(TimeoutException e) 
    // Timeout-Related stuff here

【讨论】:

【参考方案2】:

请参阅下面的 Git hub 链接以获取 TimeOutThreadPoolTask​​Executor

https://github.com/vivek-gupta-21563/timeoutthreadpool

您可以执行或提交带有首选超时参数的任务

execute(() -> System.out.println("Task to execute"), 2, TimeUnit.Minute);

submit(() -> System.out.println("Task to execute"), 2, TimeUnit.Minute);

【讨论】:

以上是关于如何使用 ThreadPoolTask​​Executor 为任务设置超时的主要内容,如果未能解决你的问题,请参考以下文章

具有小队列容量的 ThreadPoolTask​​Executor 阻塞调用线程?

Spring ThreadPoolTask Executor自动装配不同的实例

ThreadPoolTask Scheduler不适用于线程池

ThreadPoolTask Executor中corePoolSize和maxPoolSize的理想值应该是什么

logback 不会将异常记录到从 ThreadPoolTask​​Executor 池线程抛出的文件中

OpenShift 中的 Spring 批处理 JDBCPagingItemReader、ThreadPoolTask​​Executor 和多个 pod