我使用ExecutorService
来调用基本连接到应用程序(通过SSH本地或远程)的服务,并允许向其发送命令并获取其输出。
因此,Thread
创建的ExecutorService
正在等待用户输入,然后通过调用方法的实现将此输入作为任务处理,该方法返回输出,如下所示:
@Override
public String call() throws Exception {
write(command);
return readResult();
}
我想在给定时间内没有调用任务时停止Thread
(关闭ExecutorService
),但我无法找到该怎么做... { {1}}或Future.get
可以处理超时,但仅限于它调用的任务。
关于如何设法做到这一点的任何想法?
提前致谢!
此致
以星
答案 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);