线程池中奇怪的Java并发问题

线程池中奇怪的Java并发问题,java,concurrency,threadpool,executorservice,Java,Concurrency,Threadpool,Executorservice,我遇到了一些奇怪的并发问题,希望有人能帮我解决。 以下是相关代码: 由于某种原因,我不得不 executor.execute(new Runnable(){ @Override public void run() {} }); 放置在构造函数内部。否则,程序将在一段时间(约20秒)后崩溃。 这对我来说毫无意义,因为Runnable什么都不做,但它会影响执行器并防止崩溃。您的EventManager类中不需要线程 我假设它被用作侦听器并保存EventExecuto

我遇到了一些奇怪的并发问题,希望有人能帮我解决。 以下是相关代码:

由于某种原因,我不得不

executor.execute(new Runnable(){
        @Override
        public void run() {}
});
放置在构造函数内部。否则,程序将在一段时间(约20秒)后崩溃。
这对我来说毫无意义,因为Runnable什么都不做,但它会影响执行器并防止崩溃。

您的
EventManager
类中不需要线程

我假设它被用作侦听器并保存
EventExecutors
。当偶数被激发时,它正在激发事件执行器并激发它

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

以上各行在您的程序中不执行任何活动。它只是阻止系统/JVM停止运行。启动执行器后,必须调用
shutdown()
关闭
ExecutorService
-检查
EventManager
类中的
shutdown
方法

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

这不是等待
事件的适当方式

更新:

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

从Java

你能发布堆栈跟踪或你所说的崩溃吗?还有,其他代码是如何使用该类的?哦,是的,对不起,我忘了提到我没有得到任何异常或堆栈跟踪-这就像触发System.exit(0)一样。我得到的只是“构建成功”(正如Netbeans通常在程序成功退出时所显示的那样)您遇到了什么样的“奇怪”并发问题?请在问题中添加(有意义的)代码子集。线程不应该只运行
run()
方法并返回线程池吗,因为
run()
是否立即终止?为什么它会阻止JVM关闭?@BorisB。这也是我对事物如何工作的理解,这就是为什么我想知道为什么空的Runnable可以防止应用程序崩溃。在我看来,它应该没有任何效果。它是一个线程池,正在等待请求。您应该调用Shutdown来终止显式。检查ThreadPoolExecutor finalize方法。它正在调用shutdown显式。使用ExecutorService时,需要调用shutdown。试着编写一个简单的程序@MattImmer,工作已经完成,但工人们正在等待工作。@Mani:你说得对。ThreadPoolExecutor使线程保持活动状态,因为它必须保持活动状态,否则将收集线程,这将破坏线程池的用途(必须重新创建线程)。
 An unused ExecutorService should be shut down to allow reclamation of its resources