ThreadPool的奇怪的Java并发问题

时间:2014-04-30 17:32:05

标签: java concurrency threadpool executorservice

我遇到了一些奇怪的并发问题,希望有人可以帮助我。 这是有问题的代码:http://pastebin.com/HuDqknNZ

由于某种原因,我必须

executor.execute(new Runnable(){
        @Override
        public void run() {}
});

放在构造函数中。如果没有,程序将在一段时间后(大约20秒)崩溃。 这对我来说完全没有意义,因为Runnable什么都不做,但不知何故它会影响执行程序并防止崩溃。

1 个答案:

答案 0 :(得分:1)

EventManager课程不需要线程化。

我假设它被用作监听器并持有EventExecutors。当偶然发射时,它正在向事件执行者发射并射击它。

如果您的MainProgam(事件管理器除外)没有事件关闭应用程序(您尚未显示什么是主程序以及它如何使用EventManager以及您的上下文中的Event是什么

private final ExecutorService executor = Executors.newFixedThreadPool(5);

executor.execute(new Runnable(){
            @Override
            public void run() {}
        });

以上各行未在您的计划中执行任何活动。它只是停止System / JVM关闭。启动执行程序后,您必须致电shutdown()关闭ExecutorService - 检查Shutdown班级中的EventManager方法

这就是为什么没有这个阻止你的代码在20分钟后关闭(在你的术语崩溃中)(可能在所有事件执行之后)。如果你在构造函数中有这个,那么你需要调用shutDown来关闭它,否则它会保持活跃。

这不是等待event

的合适方法

更新:

 An unused ExecutorService should be shut down to allow reclamation of its resources

来自Java API