如何使 notify() 在 wait() 之前执行,我尝试使用 sleep() 但仍然无法正常工作

How to make notify() execute before wait(), i tried using sleep() but still not working

我有以下线程示例:

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() 方法不会释放锁,因此在生产者的 notify

之前调用 Thread.sleep 是没有意义的

difference-between-wait-and-sleep