我有创建 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 而发生的?或者为什么?为什么线程数失控?因此,我有内存不足的异常,线程数似乎是无限的。如果线程在池中等待,为什么要为每个线程分配这么多内存,因为我知道池中的等待线程不会使用这么多内存。
这是之前和之后的屏幕: