- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
在下面的语句中,即使没有调用通知,wait()
方法也会执行,但是 below()
语句仅在 laurel 之后执行
线程完成它的执行。
我尝试使用其他对象来锁定 hardy block 的同步,这次 wait 方法仍在永远等待,有人能解释一下为什么执行 wait()
之后的语句吗?
package delagation;
public class Solution extends Thread {
static Thread laurel, hardy;
public static void main(String[] args) throws InterruptedException {
laurel = new Thread() {
public void run() {
System.out.println("A");
try {
hardy.sleep(1000);
} catch (Exception e) {
System.out.println("B");
}
System.out.println("C");
}
};
hardy = new Thread() {
public void run() {
System.out.println("D");
try {
synchronized(laurel) {
laurel.wait();
//wait method is called here,
//There is not notify in this class,
//but the statement below are executing
System.out.println(Thread.currentThread().getName());
}
} catch (Exception e) {
System.out.println("E");
}
System.out.println("F");
}
};
laurel.setName("laurel");
hardy.setName("hardy");
laurel.start();
hardy.start();
}
}
最佳答案
您不需要假定虚假唤醒来解释这里发生的事情。当 laurel 终止时,它会向等待它的线程发送一个 notifyAll。 (这就是 Thread.join 的工作原理。)
请参阅 Thread#join 的 api 文档:
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.
此外,总是在一个循环中等待,使用一个条件;请参阅 Oracle 并发教程,尤其是 Guarded Blocks 页面。 (从描述中你可以看到 join 在一个循环中等待,在这个循环中测试的条件是 isAlive 在加入的线程上,所以这是一个很好的例子。你可以在 Thread 类的 jdk 源代码中找到 join 方法。)
关于java - wait 方法唤醒而不调用 notify(NOT SPURIOUS WAKEUP),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44076490/
我有几个线程执行一些工作,然后必须进入休眠/等待不确定的时间。稍后他们都需要被叫醒并继续工作。我可以通过在对象上调用 wait() ,然后在需要恢复时在同一对象上调用 notifyall() 来实现此
如果我会写: int selectedChannels = selector.select();Set selectedKeys = selector.selectedKeys();if ( sele
我试图了解条件变量情况下虚假唤醒与丢失唤醒之间的区别。以下是我试过的一小段代码。我知道在这种情况下“消费者”可能会在没有任何通知的情况下醒来,因此等待需要检查谓词。 但是 wait with pred
这里的一些评论让我感到困惑!我以为我知道这一点,上帝知道我已经编写了大量的 MT 代码,但已经有一段时间了...... FWIK 通知/通知所有 通知:从waitset中选出一个线程移到entryse
我正在编写另一个 NIO 服务器。有一个选择器线程执行读取、处理(大多数情况下)和写入(下面的伪代码,不是真正的 Java): while (true) { select(); for
在下面的语句中,即使没有调用通知,wait() 方法也会执行,但是 below() 语句仅在 laurel 之后执行 线程完成它的执行。 我尝试使用其他对象来锁定 hardy block 的同步,这次
我在 iOS 上的 gdx 游戏中随机出现了一些崩溃。它在其他平台上运行没有任何问题。 当应用程序退出时,我在我的 robovm 终端中得到了这个: 9/17/15 1:05:29 PM: [ERRO
我有一台服务器,它会为每个安全连接的客户端创建一个新线程。如果我使用线程池,这意味着我将同时拥有有限数量的客户端。然而,这意味着我不能监听所有客户端的端口。 我的想法是让客户端发送一个 UDP 数据包
如何以编程方式将电源选项中“唤醒时需要密码”的值更改为 false使用 C#。目前它需要密码才能在计算机从 sleep 中唤醒时解锁 手动:电源选项->高级设置->平衡-> 唤醒时需要密码-> 电池:
两种方法Thread#run and Thread#wakeup不知何故不同,但我不清楚。有人可以提供一对差异最小的代码(即差异仅在一个代码中使用 run,在另一个代码中使用 wakeup),显示不同
在 Ruby 中,Thread#run 和 Thread#wakup 有什么区别? RDoc 指定 scheduler 不使用 Thread#wakeup 调用,但这是什么意思?何时使用唤醒 与 运行
有人知道 iOS 8 上的这种异常是什么吗? === 来自崩溃报告 === Exception Type: EXC_RESOURCE Exception Subtype: WAKEUPS Except
我是一名优秀的程序员,十分优秀!