最近我在某个地方读到,使用run()和sleep()方法不能保证Java中线程的运行和睡眠状态。有什么方法可以明确地演示它吗?
最近我在某个地方读到,使用run()和sleep()方法不能保证Java中线程的运行和睡眠状态。
如果线程的run()
方法已被调用,并且线程正在旋转(即不写入日志文件或从套接字读取),但完全执行CPU任务,则它将处于RUNNABLE
状态。然而,OS/CPU可能忙于做其他事情,因此无法保证线程在任何一个时间点都能正常工作。当然,仅仅因为您编写了run()
方法并不意味着线程实际上已经启动或其他什么。
如果调用Thread.sleep(...)
,那么线程将处于TIMED_WAITING
状态。然而,线程可能会被另一个线程中断并被唤醒,或者睡眠时间当然可能已经过期。
线程状态为:
- NEW-尚未启动的线程处于此状态
- RUNNABLE-在Java虚拟机中执行的线程处于这种状态
- BLOCKED-被阻塞等待监视器锁定的线程处于这种状态。例如,正在等待输入
synchronized
块 - WAITING-无限期等待另一个线程执行特定操作的线程处于这种状态。例如CCD_ 7
- TIMED_WAITING-等待另一个线程执行操作长达指定等待时间的线程处于此状态。
Object.wait(timeoutMillis)
- TERMINATED-已退出的线程处于这种状态
有没有什么方法可以明确地证明这一点?
你当然可以做以下事情:
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();
一旦线程启动,它将休眠并显示为处于TIMED_WAITING
状态。