gpt4 book ai didi

java - 如何让notify()在wait()之前执行,我尝试使用sleep()但仍然不起作用

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

我有以下线程示例:

class Q
{
int num;
public synchronized void put(int num) {
System.out.println("Put :"+num);
this.num = num;
try {Thread.sleep(100);} catch (Exception e) {}
notify();
try {wait();} catch (Exception e) {}
}
public synchronized void get() {
try {wait();} catch (Exception e) {}
System.out.println("Get :"+num);
notify();
}
}
class Producer implements Runnable
{
Q q;
public Producer(Q q) {
this.q = q;
Thread t = new Thread(this,"Producer");
t.start();
}
public void run() {
int i = 0;
while(true) {
q.put(i++);
try {Thread.sleep(1000);} catch (Exception e) {}
}
}
}
class Consumer implements Runnable
{
Q q;
Thread t;
public Consumer(Q q) {
this.q = q;
t = new Thread(this,"Consumer");
t.start();
}
public void run() {
while(true) {
q.get();
try {Thread.sleep(500);} catch (Exception e) {}
}
}
}
public class InterThread {
public static void main(String[] args) {
Q q = new Q();
new Producer(q);
new Consumer(q);
}
}

我试图在循环中运行两个线程:消费者和生产者。共享同一个对象 q,一个线程递增 q.num 并打印其值,另一个线程仅通过打印其值来消耗 q.num。我在控制台中得到的结果是“Put :0”并停在那里,即使我使用了 Thread.sleep(100); ,消费者线程也没有被调用在生产者线程中调用notify()之前,为什么!!?

最佳答案

在这种情况下,生产者线程在消费者之前启动。调用notify(),然后调用wait()。生产者线程进入等待状态,释放获取的锁。

// producer
notify();
try {
System.out.println(Thread.currentThread().getName() + " Put :"+num);
this.wait(); // lock released
}
catch (Exception e) {

}

现在消费者线程获取锁,执行wait()。 Consumer 进入等待状态。

// consumer
try {
System.out.println(Thread.currentThread().getName() + "Get :"+num);
this.wait(); // Both the threads are waiting
}
catch (Exception e) {

}

现在两个线程都在等待另一个线程的notify调用请注意,Sleep() 方法不会释放锁,因此在生产者通知之前调用 Thread.sleep 是没有意义的

difference-between-wait-and-sleep

关于java - 如何让notify()在wait()之前执行,我尝试使用sleep()但仍然不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59864072/

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