Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/362.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 当我在多个线程上设置了等待时,如何在特定线程上调用notify?_Java_Multithreading_Thread Safety_Notify - Fatal编程技术网

Java 当我在多个线程上设置了等待时,如何在特定线程上调用notify?

Java 当我在多个线程上设置了等待时,如何在特定线程上调用notify?,java,multithreading,thread-safety,notify,Java,Multithreading,Thread Safety,Notify,我有一个代码,我在开始时为每个对象创建一个线程。然后我将线程和相关对象存储在hashmap中。当调用一个特定的方法时,我需要使用调用该方法的对象从hashmap获取线程,并执行一些逻辑。下面是我的方法 public void sendMessage(Message message) { for (Iterator<MessageListenerItem> iterator = messageListnerItemList.iterator(); iterator.hasNex

我有一个代码,我在开始时为每个对象创建一个线程。然后我将线程和相关对象存储在hashmap中。当调用一个特定的方法时,我需要使用调用该方法的对象从hashmap获取线程,并执行一些逻辑。下面是我的方法

public void sendMessage(Message message) {
    for (Iterator<MessageListenerItem> iterator = messageListnerItemList.iterator(); iterator.hasNext();) {
        MessageListenerItem messageListnerItem = (MessageListenerItem) iterator.next();
        Thread messageListenerThread = threadMessageListenerMap.get(messageListnerItem.getMl());
        System.out.println("The thread that is executing is : " + messageListenerThread.getName());
        this.messageListenerItem = messageListnerItem;
        this.message = message;
        messageListenerThread.start();
    }
}
公共无效发送消息(消息消息){
for(Iterator Iterator=messageListnerItemList.Iterator();Iterator.hasNext();){
MessageListenerItem MessageListenerItem=(MessageListenerItem)迭代器。下一步();
Thread messageListenerThread=threadMessageListenerMap.get(MessageListenerItem.getMl());
System.out.println(“正在执行的线程是:“+messageListenerThread.getName()”);
this.messageListenerItem=messageListenerItem;
this.message=消息;
messageListenerThread.start();
}
}

因此,如果从对象“a”接收到一个方法,那么线程“a”将启动。但是在线程“A”的执行结束之前,如果对象“A”再次调用这个方法,那么我必须等到线程“A”结束,然后再次使用它进行第二次调用。但同时,如果对象“B”调用此方法,它将从hashmap中获取其线程“B”并使用它。所以,如果我使用wait notify,我如何在线程执行完成后只通知线程B而不通知线程A。我如何实现这一点?请给出建议。

等待/通知对于您想要实现的目标来说太粗糙了


您必须设置一些标志或其他内容,以便ThreadB需要知道notify没有发送给它。使用
notifyAll

你能为每个线程使用不同的监视器吗?

让“线程”管理它自己的内部/阻塞队列,因此你的方法只需不断向线程队列添加消息,并不断弹出消息,在没有消息时等待,只要唤醒所有线程即可。你的代码必须处理虚假的唤醒。