如何使 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
我有以下线程示例:
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