gpt4 book ai didi

multithreading - PingPong 程序 Java 多线程

转载 作者:行者123 更新时间:2023-12-03 13:17:01 26 4
gpt4 key购买 nike

我正在尝试学习多线程的基本概念。

为什么我的乒乓程序只打印 Ping0 和 Pong0,为什么 notify() 没有启动处于等待状态的 Ping 线程?

公共(public)类 PingPong 实现 Runnable {
串词;

  public PingPong(String word) {
this.word = word;
}

public void run() {

synchronized (this) {
for (int i = 0; i < 10; i++) {
System.out.println(word + i);
try {
wait();
notifyAll();
} catch (Exception e) {
System.out.println(e.getMessage());
}
}
}
}

public static void main(String[] args) {

Runnable p1 = new PingPong("ping");
Thread t1 = new Thread(p1);
t1.start();

Runnable p2 = new PingPong("pong");
Thread t2 = new Thread(p2);
t2.start();

}

}

输出
ping0
pong0

我尝试删除 wait() 并且它正在打印 ping pong 直到循环结束。但这能保证它会按顺序打印吗?

为什么 wait() 后跟 notify() 不要求 ping1 线程开始执行?

最佳答案

  • 如果你看到 jstack,你可以看到 thread-0 和 thread-1 正在等待不同的锁。那是因为你的 p1 和 p2 是不同的对象,所以当你使用 synchronized (this) ,他们没有竞争同一个锁,所以这种方式通知是行不通的。尝试使用另一个对象作为锁。
  • 等待通知后需要运行。当两个线程都进入等待状态时,没有其他线程可以通知它们。

  • 试试这个代码:
    String word;
    Object a;
    public PingPong(String word, Object a) {
    this.word = word;
    this.a = a;
    }

    public void run() {

    synchronized (a) {
    for (int i = 0; i < 10; i++) {
    System.out.println(word + i);
    try {

    a.notifyAll();
    a.wait();
    } catch (Exception e) {
    System.out.println(e.getMessage());
    }
    }
    }
    }

    public static void main(String[] args) throws InterruptedException {

    Object a = new Object();
    Runnable p1 = new PingPong("ping", a);
    Thread t1 = new Thread(p1);
    t1.start();

    Runnable p2 = new PingPong("pong", a);
    Thread t2 = new Thread(p2);
    t2.start();

    }

    关于multithreading - PingPong 程序 Java 多线程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45233846/

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