【问题标题】:Java Thread - blocked statusJava 线程 - 阻塞状态
【发布时间】:2013-11-27 16:53:30
【问题描述】:

我有一个非常基本的问题。如果一个线程忙于 IO 操作,为什么不认为它处于 RUNNING 状态?如果 IO 操作需要很长时间,则意味着线程正在执行它的工作。一个线程在实际工作时如何被称为 BLOCKED?

【问题讨论】:

  • 它没有做任何工作,它没有在内核上运行,它没有使用 CPU,所以考虑它'RUNNING'并不完全合适!
  • 也许您将线程上下文中的“阻塞”一词与含义有所不同的“阻塞 I/O 操作”混淆了。
  • 用户线程(通常)不直接执行 I/O 操作。他们要求操作系统执行并阻止直到完成。驱动程序执行实际的 I/O,并在操作完成时向用户线程发出信号以再次运行。

标签: java multithreading


【解决方案1】:

我不知道你在哪里读到一个线程在执行 IO 时处于 BLOCKED 状态。 BLOCKED state documentation 说:

线程阻塞等待监视器锁的线程状态。处于阻塞状态的线程正在等待监视器锁进入同步块/方法或调用 Object.wait 后重新进入同步块/方法。

所以,不,线程在执行 IO 时并未处于阻塞状态(当然,除非读取或写入强制它在对象的监视器上等待)。

【讨论】:

    【解决方案2】:

    如果您在 IO 上使用线程阻塞运行以下代码

    public class Main {
        public static void main(String[] args) throws  InterruptedException {
            final Thread thread = new Thread(new Runnable() {
                @Override
                public void run() {
                    // blocking read
                    try {
                        System.in.read();
                    } catch (IOException e) {
                        throw new AssertionError(e);
                    }
                }
            });
            thread.start();
            for(int i=0;i<3;i++) {
                System.out.println("Thread status: "+thread.getState());
                Thread.sleep(200);
            }
            System.exit(0);
        }
    }
    

    打印

    Thread status: RUNNABLE
    Thread status: RUNNABLE
    Thread status: RUNNABLE
    

    【讨论】:

    • 因此,阻塞 IO 的线程状态为 RUNNABLE 只不过是占用 CPU 时间片,除了等待 IO 响应之外什么都不做。不是吗?
    • @overexchange 当线程阻塞时,它不使用 CPU(进入和退出此模式除外) 混淆是由于 JVM 不知道何时阻塞系统调用由操作系统决定。
    • 尽管分配了时间片,阻塞 IO 上的线程不需要 CPU 用于该时间片,这是可以理解的,但没有其他线程正在使用该 CPU,用于该时间片。不是吗?
    • @overexchange 如果一个线程在阻塞 IO 上,操作系统可以将 CPU 传递给另一个线程以便它可以做有用的工作,或者它可以让 CPU 空闲以节省电力。
    • @overexchange 如果你不调用任何阻塞操作,是的。请注意,对于非阻塞 IO,通常使用阻塞的选择器。
    猜你喜欢
    • 2016-07-06
    • 1970-01-01
    • 1970-01-01
    • 2012-10-17
    • 2015-03-08
    • 1970-01-01
    • 2015-07-10
    • 2015-12-04
    • 2016-01-27
    相关资源
    最近更新 更多