0

私は 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ますか? そうでない場合、実際のブロッキングを処理する (「最小化」を読む) 最善の方法は何ですか?

4

1 に答える 1

0

専用のセレクター スレッドを利用することは、まったく問題ではありません。まず、やむを得ないことです。第 2 に、AsynchronousByteChannel の実装も内部でバックグラウンド スレッドを使用します。

Selector を使用する最良の方法については、 SelectorThread実装で見つけたと思います(まだ "work" ブランチにあることに注意してください)。私は DatagramChannel でそれを試しませんでしたが、動作するはずです: AsyncSocketChannel1 と同じ方法でAsyncDatagramChannelを実装するだけです。

于 2013-07-09T12:13:29.750 に答える