gpt4 book ai didi

java - 通知和等待代码场景

转载 作者:塔克拉玛干 更新时间:2023-11-01 23:03:32 25 4
gpt4 key购买 nike

public class NotifyAndWaitExample2 {
static int i = 0;

public static void main(String[] args) {
Thread t1 = new Thread(new Runnable() {
@Override
public void run() {
synchronized (this) {
if (i <= 0) {
System.out.println("i=" + i + "in t1");
System.out.println(Thread.currentThread().getName() + "is running");
try {
wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
System.out.println(Thread.currentThread().getName() + "is waken up");
}
}
});
Thread t4 = new Thread(new Runnable() {
@Override
public void run() {
synchronized (this) {
i++;
System.out.println("i=" + i + "in t4");
System.out.println(Thread.currentThread().getName() + "is notifying");
try {
Thread.sleep(1000);
notify();
System.out.println("notified");
} catch (InterruptedException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
}
}
});
t1.start();
t4.start();
}
}

这里显示输出:-

i=0in t1 
i=1in t4
Thread-0is running
Thread-1is notifying
notified

最后一行也应该打印在输出中,即; “Thread-0 被唤醒”。为什么在打印“通知”后它不会松开对线程“t1 run() 方法”的锁定并继续执行 t1 中 wait() 之后的代码。即它应该在打印“通知”后打印“Thread-0 被唤醒”。

最佳答案

您的同步 block 没有任何效果。

您的synchronized(this) 只是获取Runnable 实例的锁,您还实现了run 方法。

您的线程 t1 永远不会收到通知,它会等待您使用 wait() 方法获得通知的 Runnable。唯一持有对此 Runnable 的引用的对象是 Thread 对象 t1 并且(通常)不会调用 notify()notifyAll() 在那个 Runnable 上。

我正在使用 int[] 来存储 int 值以及持有锁/监视器。解决方案只是向您展示如何做到这一点,并不意味着这样做是一种好的做法。

我建议阅读有关 Java 中的同步如何工作的很好的教程。

我修改了您的示例,使其按您预期的方式工作。

public class NotifyAndWaitExample2 {
private static int[] i = {0};

public static void main(String[] args) {
Thread t1 = new Thread(new Runnable() {
@Override
public void run() {
synchronized (i) {
if (i[0] <= 0) {
System.out.println("i=" + i[0] + " in t1");
System.out.println(Thread.currentThread().getName() + " is running");
try {
i.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
System.out.println(Thread.currentThread().getName() + " is waken up");
}
}
});
Thread t4 = new Thread(new Runnable() {
@Override
public void run() {
synchronized (i) {
i[0]++;
System.out.println("i=" + i[0] + "in t4");
System.out.println(Thread.currentThread().getName() + " is notifying");
try {
Thread.sleep(1000);
i.notifyAll();
System.out.println("notifying");
} catch (InterruptedException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
}
}
});
t1.start();
t4.start();
}
}

关于java - 通知和等待代码场景,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44450820/

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