2014-12-12 2 views
1

Итак, вот что я пытаюсь выполнить:Java-исполнители: Как уведомить один ожидающий поток в executer?

У меня есть FixedThreadPool с 5 потоками в нем. Эти потоки просто сидят и ждут, чтобы их уведомили. Когда сообщается, поток в пуле начинает делать вещи.

Теперь, когда происходит какое-то инициирующее событие, один и только один Ожидание Поток в пуле должен быть извещен. Возможно ли это сделать?

Вот что я пытался, но я получаю IllegalMonitorStateException:

public class Server { 
    private class WorkerThread implements Runnable{ 
     private Object lock = null; 

     WorkerThread(Object lock){ 
      this.lock = lock; 
     } 

     public void run() { 
      try{ 
       do{ 
        synchronized(lock){ 
         wait(); 
        } 
        // doSomeThing 
       }while(true); 
      } catch (InterruptedException e) { 
       System.out.println(e.getMessage()); 
      } 
     } 
    } 

    private ExecutorService executor = null; 
    private Object lock = new Object(); 

    Server() { 
     executor = Executors.newFixedThreadPool(5); 
     for(int i=0; i<5; i++){ 
      executor.execute(new WorkerThread(lock)); 
     } 
    } 

    public void calledWhenTriggerEventOccurs(){ 
     synchronized(lock) {executor.notify();} 
    } 
} 
+1

отправьте одну задачу в пул, и один поток из пула выполнит ее. Я не уверен, что понимаю ваш вопрос. –

+0

Реализовать собственный пул потоков. В общем, однако идея пула потоков предлагать ряд сменных потоков без определенного требования для запуска задачи по определенному потоку. –

ответ

1

Object.notifyAll оповещает все темы, ожидающие на мониторе этого объекта. Object.notify уведомляет одну (случайную) нить, ожидающую на мониторе. Это вы искали?

+0

Я пробовал это раньше, но получаю исключение IllegalMonitorStateException. Я добавил код в свою начальную публикацию. –

+1

@ JosephMüller: для вызова функции notify() в 'executor', вам необходимо удерживать блокировку' executor'. Чтобы вызвать wait() для объекта (ваш поток каждого вызова wait() на 'this'), вам нужно удерживать блокировку этого объекта (т. Е.' This'). Если вы хотите уведомить поток, ожидающий объекта o, вы должны вызвать уведомление об этом объекте o. wait() и notify() - очень низкоуровневые механизмы, которые трудно использовать правильно. И вы, кажется, не понимаете их. Используйте абстракцию более высокого уровня из пакета java.util.concurrent. –

+0

@ JosephMüller Просто удалите объявление 'lock' из' WorkerThread' и замените 'wait()' и 'executor.notify()' в вашем коде с помощью 'lock.wait()' и 'lock.notify()' соответственно , Правило состоит в том, что вы 'wait' и' notify' на одном и том же объекте, и это должно произойти в блоке 'synchronized' на том же самом объекте. – Dima

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

  • Нет связанных вопросов^_^