Java 在 win10 中显示关闭时线程似乎暂停
Java Thread seems to be paused when the display turns off in win10
例如:
- windows10
- jdk8
重现步骤:
(windows10) 将关闭显示时间更改为 1 分钟
运行下面的代码。 (这需要包裹在 Java class 中。)
Thread t = new Thread(() -> {
while (true) {
System.out.println(LocalDateTime.now().format(
DateTimeFormatter.ISO_DATE_TIME));
try {
Thread.sleep(10000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
});
t.start();
等几分钟
唤醒屏幕
输出
2021-02-27T14:13:56.58
2021-02-27T14:14:06.59
2021-02-27T14:14:16.59
2021-02-27T14:14:26.59
2021-02-27T14:14:36.59
2021-02-27T14:14:46.591
**2021-02-27T14:14:56.592
2021-02-27T14:15:58.345**
2021-02-27T14:16:08.346
有什么方法可以在显示器电源关闭时保持线程 运行 吗?
我认为您误解了输出。线程没有被“暂停”。
我的读数是 println
调用在显示关闭时 阻塞 。由于它正在阻塞,下一个 sleep
调用将被延迟。
无法从 Java 中解决此问题(即更改写入标准输出的行为)。阻塞发生在系统调用级别,由主机操作系统完成。
如果你想防止应用程序像这样阻塞,如果它们连接到 可能 阻塞的“接收器”,请不要直接写入标准输出/标准错误.如果您写入本地文件系统中的文件,则几乎可以保证不会阻塞。在某些情况下,其他任何东西都可能会阻止……。因此,如果线程不阻塞是绝对要求,请注意它写入的内容。
例如:
- windows10
- jdk8
重现步骤:
(windows10) 将关闭显示时间更改为 1 分钟
运行下面的代码。 (这需要包裹在 Java class 中。)
Thread t = new Thread(() -> { while (true) { System.out.println(LocalDateTime.now().format( DateTimeFormatter.ISO_DATE_TIME)); try { Thread.sleep(10000); } catch (InterruptedException e) { e.printStackTrace(); } } }); t.start();
等几分钟
唤醒屏幕
输出
2021-02-27T14:13:56.58
2021-02-27T14:14:06.59
2021-02-27T14:14:16.59
2021-02-27T14:14:26.59
2021-02-27T14:14:36.59
2021-02-27T14:14:46.591
**2021-02-27T14:14:56.592
2021-02-27T14:15:58.345**
2021-02-27T14:16:08.346
有什么方法可以在显示器电源关闭时保持线程 运行 吗?
我认为您误解了输出。线程没有被“暂停”。
我的读数是 println
调用在显示关闭时 阻塞 。由于它正在阻塞,下一个 sleep
调用将被延迟。
无法从 Java 中解决此问题(即更改写入标准输出的行为)。阻塞发生在系统调用级别,由主机操作系统完成。
如果你想防止应用程序像这样阻塞,如果它们连接到 可能 阻塞的“接收器”,请不要直接写入标准输出/标准错误.如果您写入本地文件系统中的文件,则几乎可以保证不会阻塞。在某些情况下,其他任何东西都可能会阻止……。因此,如果线程不阻塞是绝对要求,请注意它写入的内容。