gpt4 book ai didi

java - 在java线程中,如何调用notify来进行特定的notify工作?

转载 作者:行者123 更新时间:2023-12-02 05:53:59 25 4
gpt4 key购买 nike

我正在关注一本书,其中我获得了线程的 wait() 和 notification() 方法。但与notify()方法有点混淆。下面是代码:

Q 类

class Q {
int n;
boolean valueSet = false;

synchronized int get() {
while (!valueSet)
try {
wait();
} catch (InterruptedException e) {
System.out.println("InterruptedException caught");
}
System.out.println("Got: " + n);
valueSet = false;
notify();
return n;
}

synchronized void put(int n) {
while (valueSet)
try {
wait();
} catch (InterruptedException e) {
System.out.println("InterruptedException caught");
}
this.n = n;
valueSet = true;
System.out.println("Put: " + n);
notify();

生产者

class Producer implements Runnable {
Q q;

Producer(Q q) {
this.q = q;
new Thread(this, "Producer").start();
}

public void run() {
int i = 0;
while (true) {
q.put(i++);
}
}

消费者

class Consumer implements Runnable {
Q q;

Consumer(Q q) {
this.q = q;
new Thread(this, "Consumer").start();
}

public void run() {
while (true) {
q.get();
}

PCFixed

class PCFixed {
public static void main(String args[]) {
Q q = new Q();
new Producer(q);
new Consumer(q);
System.out.println("Press Control-C to stop.");
}
}

现在我的困惑是-在Q类的get()方法中,wait()方法是否使当前线程等待,直到调用put()方法的notify()方法?对吗?

所以,这是我的两个问题:

  1. 如果put()方法的notify()-通知一直在等待get方法wait()的线程,反之亦然。这里只有两个线程,因此可以互相通知。如果有另一种方法(比如说 get2())并且里面也有一个 wait() 会发生什么。 put 如何通知一个处于 waiting() 状态的特定线程方法(而不通知另一个可能也处于 waiting 状态的线程方法)?

  2. 如果我对之前的概念感到厌倦,那就是互相通知。真实案例是什么?它是如何运作的?

最佳答案

notify() 将唤醒一个一直在等待对象的线程。如果您想唤醒所有这些,您需要使用 notifyAll()notify() 本身不允许您指定唤醒哪个对象(我相信它是通过 FIFO 队列实现的,但我对此并不肯定)。如果您需要具体控制唤醒哪个线程,则需要使用多个锁对象或使用更复杂的数据结构来指定唤醒哪个线程。

关于java - 在java线程中,如何调用notify来进行特定的notify工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23277565/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com