Java线程 - 阻止状态

时间:2013-11-14 15:31:33

标签: java multithreading

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

2 个答案:

答案 0 :(得分:4)

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

  

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

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

答案 1 :(得分:3)

如果在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