当没有任务已提交给定的时间关机的ExecutorService(Shutdown ExecutorS

2019-10-19 16:37发布

我使用的是ExecutorService调用基本上连接到一个应用程序(本地或远程通过SSH)服务,并允许将命令发送到它,得到它的输出。

因此,该Thread由创建ExecutorService正在等待用户输入,然后该输入被处理为通过呼叫方法,它返回的输出,看起来像这样的一种方式的任务:

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

我想停止Thread (关闭ExecutorService )时,没有任务被称为给定的时间,但我找不到怎么办呢...... Future.getExecutorService.invoke[All|Any]可以处理超时,但只是把它称之为任务。

我如何能设法做到这一点任何想法?

提前致谢!

问候,

以星

Answer 1:

你可以只使用Executors.newCachedThreadPool()他的医生说:

尚未使用的60秒的线程将终止并从缓存中删除。 因此,对于长期保持足够的空闲池不会消耗任何资源。 需要注意的是具有类似性质的,但不同的细节(例如,超时参数)池可以使用的ThreadPoolExecutor构造来创建。

这将关闭线程,而不是整个执行,但应该是罚款,如果执行者实际上并没有采取任何资源。



Answer 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);


文章来源: Shutdown ExecutorService when no task has been submitted for a given time