使用TimeLimitedCodeBlock循环时,Java中的线程池数量过多

使用TimeLimitedCodeBlock循环时,Java中的线程池数量过多,java,multithreading,threadpool,Java,Multithreading,Threadpool,我编写了一个Java程序,它似乎工作得很好,但当我检查Mac上活动监视器的内存选项卡时,我发现与Java VM相关的“端口”数量是一个巨大的数字,目前约为49000个,并且随着我使用该程序而稳步增加。我不确定这是否是一个问题,但考虑到Activity Monitor中列出的其他程序的端口数往往要少得多(少于1000个),而且这些端口数似乎没有持续增加,我担心我的程序会留下一些垃圾,最终会导致问题 到目前为止,故障排除已将端口数增加的原因隔离为在TimeLimitedCode块内执行的代码,该块如

我编写了一个Java程序,它似乎工作得很好,但当我检查Mac上活动监视器的内存选项卡时,我发现与Java VM相关的“端口”数量是一个巨大的数字,目前约为49000个,并且随着我使用该程序而稳步增加。我不确定这是否是一个问题,但考虑到Activity Monitor中列出的其他程序的端口数往往要少得多(少于1000个),而且这些端口数似乎没有持续增加,我担心我的程序会留下一些垃圾,最终会导致问题

到目前为止,故障排除已将端口数增加的原因隔离为在TimeLimitedCode块内执行的代码,该块如下所示: .

每次代码循环通过TimeLimited块时,它都会创建一个新的线程池,如下面粘贴的示例程序输出所示,该示例程序与链接中的程序几乎相同。您可以看到,每次通过循环,池号都会从池1增加到池2,以此类推

在我的实际程序中,线程池计数很快就达到了数万,这在我的Mac的活动监视器中显示为与Java VM关联的大量端口。。。目前约为49000人。Mac活动监视器指南对这些“端口”的描述如下:

“端口”列显示进程打开了多少“Mach端口”或“内核队列”,这基本上描述了进程与其他进程的通信方式(即:保留系统内存使用)

这对我来说意味着所有这些端口都在消耗一些需要以某种方式释放的系统资源。但我真的不知道从哪里开始——如果您能评论1)我的“问题”是否真的是一个问题,以及2)我应该做什么样的故障排除来找出根本原因,我将不胜感激

谢谢

    0ms [            main] calling runWithTimeout!
   53ms [ pool-1-thread-1] starting sleep!
 1055ms [            main] got timeout!
 1055ms [ pool-1-thread-1] was interrupted!
 1055ms [            main] end of main method!
 1055ms [            main] calling runWithTimeout!
 1056ms [ pool-2-thread-1] starting sleep!
 2061ms [            main] got timeout!
 2061ms [            main] end of main method!
 2061ms [            main] calling runWithTimeout!
 2061ms [ pool-2-thread-1] was interrupted!
 2061ms [ pool-3-thread-1] starting sleep!
 3063ms [            main] got timeout!
 3063ms [            main] end of main method!
 3064ms [            main] calling runWithTimeout!
 3063ms [ pool-3-thread-1] was interrupted!
 3064ms [ pool-4-thread-1] starting sleep!
 4068ms [            main] got timeout!
 4068ms [ pool-4-thread-1] was interrupted!

您是否执行该代码的executor.shutDown()部分?我们可能需要查看您的实际代码。是的,我使用了Neeme Praks在该页面上发布的整个“公共类TimeLimitedCodeBlock”,并使用下面的示例程序作为我的起点,只是替换了他的try{log(startTime,“starting sleep!”);Thread.sleep(10000);log(startTime,“Wakeup!”);}通过调用我的其他代码。可能是我调用的其他代码中有问题。。。这是一个由其他人编写的大型软件包,但我有所有的源代码,因此可以通过它工作。。。只是不确定到底要注意什么。。。