【发布时间】:2013-01-06 09:39:43
【问题描述】:
我被这段代码卡住了,我认为我错过了一些非常重要的东西。
当线程运行时,我可以将消息添加到向量
但是当它调用 notify 时,getNextMessageFromQueue() 似乎一直处于等待状态。
我是否锁定了消息变量?
感谢您的帮助。
我的调度程序类将所有消息发送给我的客户:
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);
【问题讨论】:
-
在其他地方还有其他调用 wait() 的方法吗?您没有向我们展示完整的代码。对
client.sendMessage()的调用可能会阻塞吗?为什么 sendMessageToAllClients() 会同步?它不使用向量。 -
@user1952589 - 然后也请发布该代码。
-
为什么不用ArrayBlockingQueuetake()/put()? (Vector是通用的,Queue可能更合适)
-
如果您想出一个简单的完整示例来说明问题并且我们可以进行试验,这可能会有所帮助。
-
@Alvin Wong,我认为更普遍的做法是围绕
this进行同步(这是方法级同步所做的),因为客户端可能希望与您的对象同步,因此不情愿地干扰您自己的对象锁定。
标签: java multithreading wait notify