я застрял с этим кодом, и я думаю, что упускаю что-то действительно важное. когда поток запущен, я могу добавить сообщение в вектор, но когда он вызывает уведомление, кажется, что getNextMessageFromQueue()
продолжает ждать.
Я блокирую переменные messages?
Спасибо за вашу помощь.
Мой класс диспетчера, который отправляет все сообщения моим клиентам:
private Vector<Message> messages = new Vector<Message>();
public synchronized void addMessage(Message message) {
messages.add(message);
notify();
}
private synchronized Message getNextMessageFromQueue() throws InterruptedException {
while (messages.size() < 1) {
wait();
}
Message message = (Message) messages.get(0);
messages.removeElementAt(0);
return message;
}
private void sendMessageToAllClients(Message message) {
for (int i=0; i < clients.size(); i++) {
Client client = (Client) clients.get(i);
client.sendMessage(message);
}
}
public void run() {
try {
while (true) {
Message message = getNextMessageFromQueue();
sendMessageToAllClients(message);
}
} catch (InterruptedException ie) {
ie.printStackTrace();
}
}
Здесь клиентский класс:
private Socket socket;
private ObjectOutputStream out;
private ObjectInputStream in;
public Client(Socket s) throws IOException {
socket = s;
out = new ObjectOutputStream(socket.getOutputStream());
in = new ObjectInputStream(socket.getInputStream());
}
public Socket getSocket() {
return socket;
}
public void sendMessage(Message message) {
try {
out.writeObject(message);
out.flush();
} catch (IOException e) {
e.printStackTrace();
}
}
Вот основной вызов addMessage
:
Message message = new Message();
message.setMessage("Welcome to " + client.getSocket().getLocalAddress() + ":" + client.getSocket().getPort());
dispatcher.addMessage(message);
client.sendMessage()
заблокироваться? Почему синхронизируется функция sendMessageToAllClients()? Он не использует вектор. - person JB Nizet   schedule 06.01.2013synchronized
методов, и приводился пример, но я просто не могу найти его сейчас - person Alvin Wong   schedule 06.01.2013wait
, чтобы увидеть, получает ли поток уведомление? - person Mikita Belahlazau   schedule 06.01.2013this
(что и делает синхронизация на уровне метода), потому что клиенты могут захотеть синхронизироваться с вашим объектом и, таким образом, неохотно вмешиваться в вашу собственную блокировку. - person ignis   schedule 06.01.2013