为什么run()和sleep()不能保证我们在Java中处于运行和睡眠状态



最近我在某个地方读到,使用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状态。

最新更新