gpt4 book ai didi

java - newFixedThreadPool 创建了超出需要的任务

转载 作者:行者123 更新时间:2023-12-02 08:02:46 28 4
gpt4 key购买 nike

我有创建 N 个线程(例如 50 个线程)的方法。这些创建的线程使用 Executors.newFixedThreadPool(20) 创建新线程。因此,50 * 20 = 1000 或更多可能会在应用程序运行时创建线程。但实际情况下线程数可能会超过10000甚至更多!如何解决这个问题?我做错了什么?

这是创建线程并将它们添加到 Future 列表的代码的一部分:

        while(taskCount != 0 || futureSize > 0)
{
if(taskCount > 0)
{
for(int i = 0; i < taskCount; i++)
{
if(i % 100 == 0)
{
checkAlive(taskId);<p></p>

<pre><code> date = new Date();

System.gc();
}
}
catch(Exception ex)
{
ex.printStackTrace();
}

future.add(exec.submit(new Task());

try
{
Thread.sleep(200);
}
catch(InterruptedException ex)
{
ex.printStackTrace();
}
}
}
</code></pre>

<p></p>
也许这是因为使用了 Future 导致的?或者为什么?为什么线程数量失控?因此,我有内存不足的异常,并且线程数似乎是无限的。如果线程在池中等待,为什么要为此每个线程分配这么多内存,因为我知道池中等待的线程不会使用这么多内存。

以下是之前和之后的屏幕: before after

最佳答案

您不应该在线程内创建新的ThreadPool,您应该先创建线程池,然后将新线程添加到线程池中。

参见here举个例子。

// Thread pool for the collectors.
ExecutorService threads = Executors.newFixedThreadPool(MAX_THREADS);
// Futures of all collectors running in the pool.
ConcurrentLinkedQueue<Future> collectors = new ConcurrentLinkedQueue<Future>();
...
// Make my Callable.
Callable<Void> c = new FileListCollector(path, recurse, filter);
// Start it up and keep track of it so we can find out when it has finished.
collectors.add(threads.submit(c));

关于java - newFixedThreadPool 创建了超出需要的任务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8659502/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com