我有创建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);
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();
}
}
}
也许这是因为使用Future而发生的?或者为什么?为什么线程数量失控?因为我有内存异常,线程数似乎是无限的。如果线程在池中等待,为什么为每个线程分配如此多的内存,因为我知道池中的等待线程不会占用太多内存。
以下是之前和之后的屏幕:
答案 0 :(得分:2)
你不应该在你的线程中创建新的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));