2012-06-22 5 views
0

У меня есть класс, который содержит набор ссылок на рабочие потоки, которые получают объекты через TCP (1 на каждого клиента).Java: Wait/Notify для нескольких потоков

Я пытаюсь сделать способ getMessage() в своем классе, который ждет, пока ни один из рабочих потоков не получит сообщение и не вернет его.

То, что я получил прямо сейчас социологическая-система:

public Object getMessage() { 
    while (true) { 
     for (Worker w : workers.values()) 
      if (w.msgNumber() != 0) 
       return w.getLastMsg(); 
     Thread.sleep(100); 
    } 
} 

Это работает, но я не думаю, что это очень масштабируемым.

Я знаю, что я могу сделать wait(timeout) на каждого работника, но проблема остается прежней.

Есть ли какой-нибудь механизм ожидания/уведомления, который ждет несколько потоков?

+1

Вы хотите реализовать версию производитель/потребитель парадигмы. Эта ссылка является хорошим вступлением к этому в Java: http://www.java2s.com/Code/Java/Threads/Producer-Consumer.htm Поиск терминов «производитель потребляет java» дает гораздо больше полезных страниц. – dlev

+0

Вы могли бы, чтобы рабочие потоки уведомляли() основной поток, когда они что-то обработали. В этом случае вы можете использовать wait() (без таймаута) в основном потоке, и он проснется, когда что-то нужно будет сделать. – Jochen

ответ

4

Вы можете посмотреть, используя блокирующую очередь для связи между потоками. Рабочий поток будет вставляться в очередь, а функция getMessage() вытаскивает сообщение из очереди.

+0

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

+2

Ну, работникам не нужно знать друг о друге или «класс над ними». Они просто получают доступ к объекту очереди, в который могут вставлять сообщения, или API, который они могут вызывать для сообщений в очередь для них. – Kenster

+1

Точно. Используйте класс высокого уровня, предназначенный для этой задачи, а не 'wait()' и 'notify()'. Если вы не понимаете, как применять высокоуровневые утилиты параллелизма, как вы можете использовать примитивы низкого уровня? Единственная зависимость, которую должен иметь рабочий, - на ['java.util.Queue'] (http://docs.oracle.com/javase/7/docs/api/java/util/Queue.html). Если вы хотите, чтобы клиент был дросселирован, когда потребитель не мог идти в ногу, вы можете переключиться на ['java.util.concurrent.BlockingQueue'] (http://docs.oracle.com/javase/7/docs/api /java/util/concurrent/BlockingQueue.html) – erickson

0

Как о чем-то вроде:

try { 
     ServerSocket srv = new ServerSocket(port); 

     // Wait for connection from client. 
     while (true) { 
      System.out.println("Listening..."); 
      // Waits for connection 
      new Thread(new ServerWorkerThread(srv.accept())).start(); 

     } 
    } catch (IOException e) { 
     //handle 
    } 
+0

На самом деле перечитывая свой вопрос, на самом деле это на самом деле не отвечает. – Jeremy

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