2013-02-25 4 views
1

Я разрабатываю пул потоков в Java для ежевики, это код, который я в настоящее время:Blackberry пул потоков не работает хорошо

public class ThreadPool { 

    int maxWorkers = 15; 
    Vector queue = new Vector(); 
    Thread[] workers; 

    public ThreadPool(int maxThreads) { 



     if (maxThreads <= maxWorkers) 
      maxWorkers = maxThreads; 

     workers = new Thread[maxThreads]; 


     for (int i = 0; i < maxThreads; i++) { 

      // Crea un worker que ejecuta trabajos. 
      workers[i] = new Thread(new Runnable() { 

       public void run() { 

        Runnable r; 

        while (true) { 

         synchronized (queue) { 

          while (queue.size() == 0) { 
           try { 
            queue.wait(); 
           } catch (Exception e) { 
            System.out.println("Error while waiting"); 
           } 
          } 

          try { 

           r = (Runnable) queue.firstElement(); 
           queue.removeElement(r); 
           r.run(); 
           queue.notify(); 
          } catch (Throwable e) { 
           System.out.println("nope!"); 
          } 
         } 
        } 
       } 
      }); 


      workers[i].start(); 
     } 
    } 

    public void addWork(Runnable work) { 

     synchronized (queue) { 
      queue.addElement(work); 
      queue.notify(); 
     } 
    } 
} 

Проблема в том, что если я очередь 10 рабочих мест, они будут выполнять один после того, как другой, а не в совместительству, как, например:

for (int i=0; i<10; i++) { 
     pool.addWork(new Runnable() { 

       public void run() { 

        Random random = new Random(); 
        int time = random.nextInt(5) * 1000; 


           System.out.println("I'm work " + i); 

        try {     
         Thread.sleep(time); 
        } catch (InterruptedException e) { 
         e.printStackTrace(); 
        } 
       } 
      }); 
    } 

И я получаю:

I'm work 1 
I'm work 2 
I'm work 3 
... 

ответ

2

Вы е выполняя свою работу (т. r.run()) внутри синхронизированного оператора очереди, поэтому блокировка очереди не освобождается до тех пор, пока каждый поток не завершит свою работу. Вы должны выполнить задание вне синхронизированного оператора. Попробуй это.

+0

'r.run()' не выполняется внутри Thread. –

+0

Спасибо человеку !!! Ты восхитителен!!! –

+0

Уже пробовал ответить @sroj, и он отлично работал, помните, что «r» - это исполняемый объект, его метод запуска действительно можно вызвать внутри потока. –

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