newFixedThreadPool создает больше задач, чем необходимо - PullRequest
0 голосов
/ 28 декабря 2011

У меня есть метод, который создает N потоков (например, 50 потоков).Эти созданные темы создают новые темы с Executors.newFixedThreadPool(20).Так что 50 * 20 = 1000 или чуть больше, возможно, созданных потоков во время работы приложения.Но в реальной ситуации количество потоков может быть более 10000 и более!Как это исправить?Что я делаю не так?

Вот часть кода, которая создает потоки и добавляет их в список Future: <pre> while(taskCount != 0 || futureSize > 0) { if(taskCount > 0) { for(int i = 0; i < taskCount; i++) { if(i % 100 == 0) { checkAlive(taskId);</p> <pre><code> 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?Или почему?Почему количество потоков вышло из-под контроля?Из-за этого у меня есть исключения из нехватки памяти, и число потоков кажется неограниченным.И если потоки ждут в пуле, почему для этого каждого потока выделяется столько памяти, насколько я знаю, ожидающие потоки в пуле не используют столько памяти.

Вот экраны до и после: beforeafter

1 Ответ

2 голосов
/ 29 декабря 2011

Вы не должны создавать новые ThreadPool s внутри своих потоков, вы должны сначала создать пул потоков, а затем добавить свои новые потоки в пул потоков.

См. здесь дляпример.

// 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));
...