首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >使用newFixedThreadPool会导致一些奇怪的问题

使用newFixedThreadPool会导致一些奇怪的问题
EN

Stack Overflow用户
提问于 2019-01-23 16:15:32
回答 1查看 33关注 0票数 0

在多线程程序中,我使用了线程数为10的newFixedThreadPool。

我遇到的第一个问题是系统上活动线程的数量,"ps huH p PID | wc -l“记录的数据显示系统中的活动线程数量要大得多,为80个线程。此外,执行线程的程序从队列中读取消息,然后由该消息触发每个线程。

第二个问题是java堆空间异常。实际上,它发生在程序执行一段时间之后。

最后,最后一个问题是,虽然没有消息可以或甚至没有消息被线程从队列中读取,但是线程的输出表明它们是活动的,并且正在处理一些数据。

根据上述问题,我的问题如下:

  • newFixedThreadPool(n)同时具有最多n个线程不是一个有保证的规则吗?
  • 如果线程的数量是固定的,那么为什么GC异常会出现?
  • 最后一个问题是如何实现的?

此外,我还测试了

代码语言:javascript
复制
new ThreadPoolExecutor((10, 10, 10, TimeUnit.MILLISECONDS, new ArrayBlockingQueue<>(2 * 10));

但一切都没变。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-02-19 03:56:28

事实上,上述问题得到了解决。我将只描述问题的每个部分:"ps huH p PID | wc -l":此命令不会获取仍在使用ThreadPool运行的实际线程数,但会显示作业的操作系统级线程总数。

newFixedThreadPool(n):有一个无界阻塞队列,这意味着当您的程序的输入可用时,它将创建一个对象并将其添加到该阻塞队列中。因此,当有大量输入元素时,可能会出现内存问题。

最后,下面的选项不起作用,因为ArrayBlockingQueue的默认实现有一个用于向其中插入新对象的offer方法。

代码语言:javascript
复制
new ThreadPoolExecutor((10, 10, 10, TimeUnit.MILLISECONDS, new ArrayBlockingQueue<>(2 * 10));

顾名思义,offer方法试图将请求的对象添加到arrayBlockingQueue的末尾。否则,如果使用ArrayBlockingQueue的put方法,问题就解决了。为此,我扩展了ArrayBlockingQueue并通过在offer的方法阻塞队列中调用它的put方法来覆盖它的offer方法。

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

https://stackoverflow.com/questions/54322682

复制
相关文章

相似问题

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