首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用ExecutorService时正确管理内存

使用ExecutorService时正确管理内存
EN

Stack Overflow用户
提问于 2014-09-16 12:23:11
回答 1查看 622关注 0票数 1

有一个名为"ConcurrencyUtils“的实用程序类在内部使用ExecutorService

代码语言:javascript
复制
private static final ExecutorService executor = Executors.newCachedThreadPool(new CommonPoolThreadFactory());

如您所见,它使用一个线程池,它将根据需要添加线程。问题是,如果池中至少有一个线程(如果至少使用了一次util ),那么当main方法执行完成应用程序时,却没有关闭,因为线程仍然是活动的,并且不是垃圾收集的.

一开始我试着用

代码语言:javascript
复制
public static void close(){
    executor.shutdown();
}

并在程序自然停止执行时调用它。但是不能保证主方法是最后完成的方法,在应用程序终止之前还可以完成其他任务,因此我不知道在何处调用"close()“来清除util中的线程。

我想知道社区是否能提示我一种更聪明、更清洁的方式来实现这一点?

ConcurrencyUtil可以在任何地方使用,我不能创建它的实例,我需要它通过静态而不是实例方法提供它的接口。

更新

让我详细解释一下这个例子,ConcurrencyUtil有它自己的池实现,它提供了有用的方法来链接多个可运行项并以paralell方式执行它们,或者让其中的一些等待另一个完成,然后执行.重要的是,它应该是一个实用程序类,以便每当您想要使用异步()或chain()时,不要担心它是如何工作的。

现在是示例代码:

代码语言:javascript
复制
public static void main(String[] args) {
    Runtime.getRuntime().addShutdownHook(new Thread() {
        @Override
        public void run() {
            System.out.println("hoooooooooooook");
        }
    });


    ConcurrencyUtil.chain()
            .add(()->System.out.println("task 1"))
            .add(()->System.out.println("task 2"))
            .execute()
            .join();

    System.out.println("main finish");
}

当它执行时,我将得到以下内容:

代码语言:javascript
复制
created new thread with name [common-pool : thread-1]
created new thread with name [common-pool : thread-2]
task 1 
task 2 
main finish

如您所见,线程池创建两个线程并执行并发任务,但是那些工作线程仍然活着(在睡眠中)等待新任务,这就是为什么主执行完成后应用程序仍然在运行.关闭钩子也不能正常工作,因为(我想)应用程序被认为是活着的.

现在,考虑到我无法保证主方法是我的出口点(例如,如果我删除了.join(),它可能是一个完成执行的可运行的方法),这就是为什么我不能最后放置块并关闭ConcurrencyUtil.

有什么好的办法吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-09-16 14:04:23

正确的应用程序设计方法是引入一个显式关闭过程,在适当的地方调用这个过程。然后,这个过程可以调用执行器服务上的shutdown(),然后是awaitTermination()。查看ExecutorService的Javadoc以获得完整的代码示例。

除了常规的关机协议之外,您还可以提供一个JVM关机挂钩,这将再次启动相同的关闭过程。您永远不应该依赖这种机制,但是在不可预知的失败情况下拥有它是一件好事。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/25868660

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档