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



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

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

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

我想停止Thread(关闭ExecutorService)时,没有任务已被调用给定的时间,但我找不到如何做到这一点…Future.getExecutorService.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);

相关内容

  • 没有找到相关文章

最新更新