Вы должны определенно использовать очередь вместо Vector
!
Присвойте каждому потоку свою очередь и, когда получено новое сообщение, add()
новое сообщение в очередь каждого потока. Для гибкости может быть полезен и шаблон слушателя.
Edit:
Хорошо, я чувствую, что тоже должен добавить пример:
(Классическая картина наблюдателя)
Это интерфейс, который должны реализовывать все потребители:
public interface MessageListener {
public void newMessage( byte[] message );
}
Производитель может выглядеть так:
public class Producer {
Collection<MessageListener> listeners = new ArrayList<MessageListener>();
// Allow interested parties to register for new messages
public void addListener( MessageListener listener ) {
this.listeners.add( listener );
}
public void removeListener( Object listener ) {
this.listeners.remove( listener );
}
protected void produceMessages() {
byte[] msg = new byte[10];
// Create message and put into msg
// Tell all registered listeners about the new message:
for ( MessageListener l : this.listeners ) {
l.newMessage( msg );
}
}
}
И потребительский класс может быть (используя блокирующую очередь, которая делает все это wait()
ing и notify()
ing для нас):
public class Consumer implements MessageListener {
BlockingQueue< byte[] > queue = new LinkedBlockingQueue< byte[] >();
// This implements the MessageListener interface:
@Override
public void newMessage( byte[] message ) {
try {
queue.put( message );
} catch (InterruptedException e) {
// won't happen.
}
}
// Execute in another thread:
protected void handleMessages() throws InterruptedException {
while ( true ) {
byte[] newMessage = queue.take();
// handle the new message.
}
}
}