У меня есть метод, который создает N потоков (например, 50 потоков). Эти созданные потоки создают новые потоки с Executors.newFixedThreadPool(20)
. Так 50 * 20 = 1000
или немного больше, возможно, созданные потоки во время работы приложения. Но в реальной ситуации количество потоков может быть более 10000 и более! Как это исправить? Что я делаю не так?newFixedThreadPool создает больше задач, чем необходимо
Здесь часть кода, который вызывает темы и добавляйте их в список будущего:
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();
}
}
}
Возможно, это произошло из-за использования Будущего? Или почему? Почему количество потоков выходит из-под контроля? Из-за этого у меня есть исключения из памяти и количество потоков, которые, по-видимому, не ограничены. И если потоки ждут в пуле, почему столько памяти выделяет для этого каждый поток, как я знаю, что ожидающие потоки в пуле не используют столько памяти.
Вот экраны до и после:
Я не вижу никакого вызова 'Executors.newFixedThreadPool (20)'. Этот метод был бы интересным. – user802421
Вы забыли включить создание потока в свой образец кода. – toto2
@ toto2 это 'future.add (exec.submit (new Task());' в образце – purple