2011-12-28 3 views
0

У меня есть метод, который создает 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(); 
       } 
      } 
     } 

Возможно, это произошло из-за использования Будущего? Или почему? Почему количество потоков выходит из-под контроля? Из-за этого у меня есть исключения из памяти и количество потоков, которые, по-видимому, не ограничены. И если потоки ждут в пуле, почему столько памяти выделяет для этого каждый поток, как я знаю, что ожидающие потоки в пуле не используют столько памяти.

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

+1

Я не вижу никакого вызова 'Executors.newFixedThreadPool (20)'. Этот метод был бы интересным. – user802421

+0

Вы забыли включить создание потока в свой образец кода. – toto2

+0

@ toto2 это 'future.add (exec.submit (new Task());' в образце – purple

ответ

2

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

См. Например, 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)); 
+0

Yep Я знаю, но у меня есть потоки, которые я добавляю в пул потоков, и которые должны создавать другие потоки (которые делают что-то еще). – purple

Смежные вопросы