gpt4 book ai didi

java - 在 Java 中从 main() 中的 Thread 实例上运行 wait()

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

我正在研究 java.lang.Object 中 wait() 的定时版本,并观察到它在两种不同情况下的行为不同。

场景一:在Thread中使用run()的默认定义

public static void main (String[] args) throws InterruptedException {
Thread t = new Thread();
t.start();
System.out.print("X");
synchronized(t) { t.wait(10000);}
System.out.print("Y");
}

关于场景 1 的问题: 我在 X 和 Y 之间遇到延迟。这是因为我从 main 调用 wait()(即使在 t 上),因此调用 main 的调用堆栈正在使用线程,而不是第二个线程?

场景 2: 动态子类化 Thread 以覆盖 run() 以打印某些内容。

public static void main (String[] args) throws InterruptedException {
Thread t = new Thread() {public void run()
{System.out.print("I am the second thread.");}};
t.start();
System.out.print("X");
synchronized(t) { t.wait(10000);}
System.out.print("Y");
}

关于场景 2 的问题:我根本没有遇到任何延迟!仅仅因为我覆盖了 run() 就发生了什么变化?现在,每次我运行程序时,它都会立即打印“XI am the second thread.Y”,没有任何延迟! wait() 的效果去哪儿了?

最佳答案

您实际上已经遇到了为什么您永远不应该在 Thread 上调用 waitnotify(All) 的原因(请参阅 Thread 的 JavaDocs)。在内部,Thread 使用 wait 和 notifyAll 来实现 Thread.join(),所以在第二种情况下发生的是你的线程进入等待,但随后另一个线程死掉并调用 notifyAll(),这唤醒了你的主线程。

如果您只想等待一段时间,请使用Thread.sleep,如果您真的想等待线程终止,请使用Thread.join。此外,请阅读 Object 中的 javadoc,以正确使用 waitnotifynotifyAll

javaDoc :

public final void join(long millis)
throws InterruptedException

Waits at most millis milliseconds for this thread to die. A timeout of 0 means to wait forever. This implementation uses a loop of this.wait calls conditioned on this.isAlive. As a thread terminates the this.notifyAll method is invoked. It is recommended that applications not use wait, notify, or notifyAll on Thread instances.

关于java - 在 Java 中从 main() 中的 Thread 实例上运行 wait(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30597057/

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