Статус Java – заблокирован

У меня есть очень простой вопрос. Если stream занят в операции ввода-вывода, почему он не рассматривается в состоянии RUNNING? Если операция ввода-вывода занимает много времени, это означает, что stream выполняет свою работу. Как можно назвать stream BLOCKED, когда он действительно работает?

Я не знаю, где вы читаете, что stream выполняется в состоянии BLOCKED при выполнении ввода-вывода. В документации по BLOCKED говорится:

Состояние резьбы для streamа, заблокированного в ожидании блокировки монитора. Нить в заблокированном состоянии ожидает блокировки монитора для ввода синхронизированного блока / метода или повторного входа в синхронизированный блок / метод после вызова Object.wait.

Таким образом, нет, stream не находится в заблокированном состоянии при выполнении IO (если, конечно, чтение или запись не заставляют его ждать на мониторе объекта).

Если вы запустите следующий код с блокировкой streamа на 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