のポイントは、SynchronousQueue
通常はまったく非同期である何かを同期することです。あるスレッドがアイテムをキューに入れ、別のスレッドがアイテムを取得しようとします。
はSynchronousQueue
実際にはキューではありません。容量も内部ストレージもありません。別のプロセスが現在キューに入れようとしている場合にのみ、キューからの取得を許可します。
例:
プロセス A はキューに入れようとします。これは今のところブロックします。プロセス B は、キューから取得しようとします。誰かが入れようとしているので、アイテムは A から B に転送され、両方のブロックが解除されます。
プロセス B はキューから取得しようとしますが、誰も書き込みを試みません。したがって、B は現在ブロックされています。プロセス A はアイテムを入れたいと考えています。アイテムは B に転送され、A と B はブロックされなくなりました。
ブロッキングについて:
Sun/Oracle JRE 実装では、時間指定操作 (「1 秒間試行」など) を行う場合、待機/通知パターンの代わりにポーリングを使用します。これは理にかなっています。時間切れになるまで定期的に再試行します。時間指定のない操作 (「時間がかかっても」など) を使用するpark
と、状況が変化した場合に再び起動します。どちらの状況でも、コアの 1 つがループを回転させるために常にビジー状態になることはありませんfor (;;)
。この場合の「無期限に再試行する」は、「常に回転している」という意味ではありません。