私は java.nio の非同期機能を調べてきましたが、これまでのところ、AsynchronousByteChannel
読み取りまたは書き込み操作ごとに完了コールバックを提供できるので、このクラスのファンです。これは、scala のFuture
クラスにうまく適合します。
今、私はDatagramChannel
非同期的に対話しようとしています。(好奇心の問題として、私は独自の torrent クライアントを実装しようとしていますが、一部のトラッカーは UDP を使用しています。)
現在の私の目標は、元の署名から電流read
とメソッドを適応させる手段を見つけることです...write
def write(src: ByteBuffer): Int
def read(dest: ByteBuffer): Int
次のようなスカラ未来指向の署名に...
def write(src: ByteBuffer): scala.concurrent.Future[Int]
def read(dest: ByteBuffer): scala.concurrent.Future[Int]
API を調べてオンラインで例を見つけ、Selectorクラスへの道を見つけました。私が知る限り、それはDatagramChannel
「ノンブロッキング」にするために使用する必要があるものですが、関連すると思われる3つの方法があります。
select() - blocks until a selection is ready
select(timeout) - blocks until either a selection is ready or timeout is reached
selectNow - doesn't block, but is useless if called before a selection is ready
したがって、「非ブロッキング」の私の選択は、ブロックするか(wtf?)、select メソッドの 1 つを繰り返し呼び出すビジー ループを実行するスレッドを占有するかのいずれかです。これは私の問題です。
を使用して真のノンブロッキング IO を実現する方法はありDatagramChannel
ますか? そうでない場合、実際のブロッキングを処理する (「最小化」を読む) 最善の方法は何ですか?