我有一个非常基本的问题。如果一个线程忙于 IO 操作,为什么不认为它处于 RUNNING 状态?如果 IO 操作需要很长时间,则意味着线程正在执行它的工作。一个线程在实际工作时如何被称为 BLOCKED ?
问问题
3113 次
2 回答
5
我不知道您在哪里读到线程在执行 IO 时处于 BLOCKED 状态。BLOCKED 状态文档说:
线程阻塞等待监视器锁的线程状态。处于阻塞状态的线程正在等待监视器锁进入同步块/方法或调用 Object.wait 后重新进入同步块/方法。
所以,不,线程在执行 IO 时并不处于阻塞状态(当然,除非读取或写入强制它在对象的监视器上等待)。
于 2013-11-14T15:44:31.513 回答
5
如果您在 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
于 2013-11-14T16:11:22.277 回答