我使用ExecutorService
来调用一个服务,该服务基本上连接到一个应用程序(通过SSH本地或远程),并允许向它发送命令并获得其输出。
因此,由ExecutorService
创建的Thread
正在等待用户输入,然后通过call方法的实现将此输入作为任务处理,该方法返回输出,如下所示:
@Override
public String call() throws Exception {
write(command);
return readResult();
}
我想停止Thread
(关闭ExecutorService
)时,没有任务已被调用给定的时间,但我找不到如何做到这一点…Future.get
或ExecutorService.invoke[All|Any]
可以处理超时,但只针对它调用的任务。
你知道我该怎么做吗?
您可以使用Executors.newCachedThreadPool()
,它的文档说:
超过60秒未使用的线程将被终止并从缓存中删除。因此,长时间保持空闲状态的池不会消耗任何资源。请注意,可以使用ThreadPoolExecutor构造函数创建具有相似属性但不同细节(例如,超时参数)的池。
这将关闭线程,而不是整个执行器,但如果执行器实际上没有占用任何资源,这应该是好的。
您可能想看一下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);