【问题标题】:Java thread stuck with notify callJava线程卡住了通知调用
【发布时间】: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


【解决方案1】:

我认为你在in = new ObjectInputStream(socket.getInputStream()); 行有误 如果不需要,请将其删除或以其他方式重建。阅读此Java sockets: Program stops at socket.getInputStream() w/o error?

要了解您的 inputData 是否为空,请使用 socket.getInputStream().available(),它返回输入字节的大小。

【讨论】:

    猜你喜欢
    • 2020-11-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-02
    • 1970-01-01
    相关资源
    最近更新 更多