newFixedThreadPool创建了比需要更多的任务

时间:2011-12-28 18:01:19

标签: java multithreading concurrency future

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

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

1 个答案:

答案 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));