gpt4 book ai didi

java - 为什么run()和sleep()不能保证我们在Java中的运行和 sleep 状态?

转载 作者:行者123 更新时间:2023-12-01 08:07:42 27 4
gpt4 key购买 nike

最近我在某处读到,使用 run() 和 sleep() 方法不能保证 Java 中线程的运行和 sleep 状态。有什么方法可以明确地演示它吗?

最佳答案

Recently I read somewhere that using the methods run() and sleep() cannot guarantee us the running and sleeping states for a thread in Java.

如果线程的 run() 方法已被调用并且线程正在旋转(即不写入日志文件或从套接字读取)但完全执行 CPU 任务,那么它将在RUNNABLE 状态。然而,操作系统/CPU 可能正忙于做其他事情,因此无法保证线程在任何一个时间点实际上都在工作。当然,仅仅因为您编写了 run() 方法并不意味着线程实际上已经启动或发生任何事情。

如果调用Thread.sleep(...),那么线程将处于TIMED_WAITING状态。但是,线程可能会被另一个线程中断并唤醒,或者 sleep 时间当然可能已过期。

thread states是:

  • 新 - 尚未启动的线程处于此状态。
  • RUNNABLE - 在 Java 虚拟机中执行的线程处于此状态。
  • BLOCKED - 因等待监视器锁而被阻塞的线程处于此状态。例如,等待进入同步 block 。
  • WAITING - 无限期等待另一个线程执行特定操作的线程处于此状态。例如Object.wait();
  • TIMED_WAITING - 等待另一个线程执行操作达指定等待时间的线程处于此状态。 Object.wait(timeoutMillis)
  • 已终止 - 已退出的线程处于此状态。

Is there some way I can explicitly demonstrate it?

您当然可以执行以下操作:

new Thread(new Runnable() {
public void run() {
long x = 0;
for (long y = 0; y < Long.MAX_VALUE; y++) {
x += y;
}
System.out.println("it will never get here of course: " + x);
}
}, "Running-Thread").start();

一旦线程启动,它将旋转并处于RUNNABLE状态。您可以使用 jconsole 查看所有线程状态。

new Thread(new Runnable() {
public void run() {
try {
Thread.sleep(Long.MAX_VALUE);
} catch (InterruptedException e) {
// always a good pattern
Thread.currentThread().interrupt();
e.printStackTrace();
return;
}
}
}, "Sleeping-Thread").start();

一旦线程启动,它将 hibernate 并显示为TIMED_WAITING状态。

关于java - 为什么run()和sleep()不能保证我们在Java中的运行和 sleep 状态?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20206364/

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