Основной ответ на (1) - «не беспокойся об этом - операционная система справится с этим». Вызовы, такие как чтение из входных потоков, по сути являются обертками для вызовов операционной системы. Под капотом внутри ОС, как мне кажется, обычно происходит, когда вызов «блокирует» в этих случаях то, что ОС «знает», что она ожидает аппаратного прерывания, скажем, от контроллера диска, чтобы сказать, что такой-и - такие запрошенные данные теперь доступны, и он знает, что поток X запросил эти данные. Таким образом, он не планирует снова в потоке X, пока не получит это прерывание (или прерывание, говорящее «произошла ошибка» и т. Д.). (И часть алгоритма планирования потока затем делает такие вещи, как предоставление ожидающему потоку временного «повышения» некоторого вида, когда эти ожидаемые данные становятся доступными. Опять же, обычно вам не нужно слишком беспокоиться об этом.) Или другими словами: какими бы точными ни были детали этого механизма, он недоступен обычному программисту на Java.
В (2) я бы предложил больше подумать о том, «как мне сделать Вещи X, которые могут оказаться блокированными». Я думаю, что ответ вряд ли когда-либо заключается в том, что Thing You Want To Do намеренно является просто «блоком», и чем бы Thing X ни был, вероятно, есть библиотечный метод / класс, который сделает это за вас. Например (ссылки включают некоторые материалы, которые я написал на эти темы):
- если вы хотите получить следующее сообщение / задание, когда оно станет доступным из какой-либо очереди / провайдера, посмотрите блокирующие очереди
- если вам нужно контролировать доступ к общему ресурсу с помощью «блокировки» на объекте, ожидая, когда блокировка станет доступной, если необходимо, рассмотрите простую старую синхронизацию или явную блокировку ;
- если вы хотите подождать, пока один из множества объединенных ресурсов станет доступным, посмотрите на семафоры
Я бы сказал, что необработанный механизм ожидания / уведомления в значительной степени устарел с API параллелизма Java 5. И что бы вы ни делали, спинлокинг обычно является самым последним средством.