500 рабочих потоков, что за пул потоков? - PullRequest
7 голосов
/ 19 мая 2010

Мне интересно, если это лучший способ сделать это. У меня около 500 потоков, которые работают бесконечно, но Thread.sleep на минуту, когда выполняется один цикл обработки.

   ExecutorService es = Executors.newFixedThreadPool(list.size()+1);
   for (int i = 0; i < list.size(); i++) {
      es.execute(coreAppVector.elementAt(i)); //coreAppVector is a vector of extends thread objects
   }

Код, который выполняется, действительно прост и в основном это

class aThread extends Thread {
   public void run(){
      while(true){
         Thread.sleep(ONE_MINUTE);
         //Lots of computation every minute
      }
   }
}

Мне нужны отдельные потоки для каждой выполняемой задачи, поэтому изменение архитектуры не вариант. Я попытался сделать мой размер ThreadPool равным Runtime.getRuntime (). AvailableProcessors (), который пытался запустить все 500 потоков, но только 8 (4xhyperthreading) из них выполнялись. Другие потоки не сдались бы и позволили другим потокам иметь свою очередь. Я попытался положить в wait () и notify (), но все равно не повезло. Если у кого-то есть простой пример или несколько советов, буду благодарен!

Ну, дизайн, возможно, имеет недостатки. Потоки реализуют Genetic-Programming или GP, тип алгоритма обучения. Каждый поток анализирует передовые тенденции, делает прогнозы. Если поток когда-либо завершается, обучение теряется. Тем не менее, я надеялся, что sleep () позволит мне поделиться некоторыми ресурсами, пока один поток не "изучает"

Таким образом, фактические требования

как я могу планировать задачи, которые поддерживают состояние и запуск каждые 2 минуты, но контролировать, сколько выполнить одновременно.

Ответы [ 11 ]

0 голосов
/ 19 мая 2010

Вам нужен семафор.

class AThread extends Thread {
   Semaphore sem;
   AThread(Semaphore sem) {
     this.sem = sem;
   }
   public void run(){
      while(true){
         Thread.sleep(ONE_MINUTE);
         sem.acquire();
         try {
           //Lots of computation every minute
         } finally {
           sem.release();
         }
      }
   }
}

При создании экземпляров AThreads вам нужно передать тот же экземпляр семафора:

Semaphore sem = new Semaphore(MAX_AVAILABLE, true);

Редактировать: Кто проголосовал, можете объяснить, почему? Что-то не так в моем решении?

...