gpt4 book ai didi

java - 调用wait()、notify()或notifyAll()时如何获得相同的监视器?

转载 作者:行者123 更新时间:2023-12-02 04:46:47 25 4
gpt4 key购买 nike

主线程创建两个线程 t1 和 t2 这些线程的 run() 方法创建两个新线程 c1 和 c2。我想要一个场景,直到 c1 和 c2(t1 的)处于 Activity 状态 t2 才会开始执行。在我的代码中,notify 和 wait 导致运行时异常。由于它们不在同步块(synchronized block)中,该怎么办?

public class childTcreat2newthread {

public static void main(String[] args) throws InterruptedException {
Thread mainT = Thread.currentThread();
Target ra = new Target("a");
Thread t1 = new Thread(ra);
t1.start();
t1.join();

while (ra.getC1().isAlive() == true || ra.getC2().isAlive() == true) {
synchronized (mainT) {
mainT.wait();
}
}
new Thread(new Target("b")).start();
}
}

class Target implements Runnable {
Thread c1 = new Thread(new Target1("1"));

Thread c2 = new Thread(new Target1("2"));
String msg;

Target(String msg) {
this.msg = msg;
}

@Override
public void run() {

for (int j = 0; j < 100000; j++) {
for (int i = 0; i < 10000; i++) {
if (i % 10000 == 0 && j % 10000 == 0) {
System.out.print(msg);
}
}
}

t1.start();

t2.start();
}

public Thread getC1() {
return c1;
}

public Thread getC2() {
return c2;
}
}

class Target1 implements Runnable {

String msg;

Target1(String msg) {
this.msg = msg;
}

@Override
public synchronized void run() {
for (int j = 0; j < 100000; j++) {
for (int i = 0; i < 100000; i++) {
if (i % 100000 == 0 && j % 10000 == 0) {
System.out.print(msg);
}
}
}
try {

notifyAll();
System.out.println("K");
} catch (IllegalMonitorStateException e) {
System.out.println("\nIllegalMonitorStateException!! in " + msg + "\n");
}
}
}

wait()告诉调用线程放弃监视器并进入休眠状态,直到其他线程进入同一监视器并调用notify()。调用notify时无法获取同一监视器。如何去做这个?以及它的重要性是什么?

最佳答案

您应该避免 wait()/notify() 并尽可能使用 Java 提供的更高级别的抽象,请参阅:Java Concurrency Tutorial .

使用wait()/notify(),两个调用必须使用相同的监视器,请参阅Guarded Blocks 。即使这只是为了学习,我也没有看到使用 wait() 来完成这项工作的好方法。您应该坚持使用 join() 或使用更高级别的抽象之一。

关于java - 调用wait()、notify()或notifyAll()时如何获得相同的监视器?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29601632/

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