在给定时间内未提交任务时关闭ExecutorService

时间:2014-03-27 16:10:22

标签: java executorservice callable

我使用ExecutorService来调用基本连接到应用程序(通过SSH本地或远程)的服务,并允许向其发送命令并获取其输出。

因此,Thread创建的ExecutorService正在等待用户输入,然后通过调用方法的实现将此输入作为任务处理,该方法返回输出,如下所示:

@Override
public String call() throws Exception {
    write(command);
    return readResult();
}

我想在给定时间内没有调用任务时停止Thread(关闭ExecutorService),但我无法找到该怎么做... { {1}}或Future.get可以处理超时,但仅限于它调用的任务。

关于如何设法做到这一点的任何想法?

提前致谢!

此致

以星

2 个答案:

答案 0 :(得分:3)

您可以使用Executors.newCachedThreadPool(),其文档说明:

  

终止未使用60秒的线程并从缓存中删除。因此,长时间闲置的池不会消耗任何资源。请注意,可以使用ThreadPoolExecutor构造函数创建具有相似属性但不同详细信息的池(例如,超时参数)。

这会关闭线程,而不是整个执行程序,但如果执行者没有实际获取任何资源,这应该没问题。

答案 1 :(得分:2)

您可能想要查看Executors类的实现:例如,使用newCachedThreadPool()创建的执行程序已经超时:

return new ThreadPoolExecutor(0, Integer.MAX_VALUE,
    60L, TimeUnit.SECONDS, new SynchronousQueue<Runnable>());

这里的超时是60秒。如果要构造具有超时固定池大小的执行程序,则还必须设置allowCoreThreadTimeOut(true)

ThreadPoolExecutor e = 
    new ThreadPoolExecutor(poolSize, poolSize,
        keepAliveTime, timeUnit, new LinkedBlockingQueue<Runnable>());
e.allowCoreThreadTimeOut(true);
相关问题