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

スレッド内に新しい を作成しないThreadPoolでください。最初にスレッド プールを作成してから、新しいスレッドをスレッド プールに追加する必要があります。

例については、こちらを参照してください。

// 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 に答える