0

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

这是之前和之后的屏幕: 前 后

4

1 回答 1

2

你不应该在你的线程中创建 new ThreadPools,你应该首先创建线程池,然后将你的新线程添加到线程池中。

有关示例,请参见此处。

// 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));
于 2011-12-29T01:58:23.647 回答