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