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 を使用しているために発生したのでしょうか。またはなぜですか?スレッド数が制御不能なのはなぜですか? そのため、メモリ不足の例外があり、スレッド数は無制限のようです。また、スレッドがプールで待機している場合、プールで待機しているスレッドがそれほど多くのメモリを使用しないことがわかっているため、各スレッドにこれほど多くのメモリが割り当てられるのはなぜですか。
前後の画面は次のとおりです。