私は、Java NIOを使って、スレッドとスレッドを選択して(実際の読み書きを行うために)、単純なファイルサーバを実装しています。Java NIO SocketChannel.read()with multithread
コードの主要部分は、次のようになります
while (true) {
int num = selector.select();
if (num > 0) {
Iterator<SelectionKey> keys = selector.selectedKeys().iterator();
final SelectionKey key = keys.next();
keys.remove();
if (key.isValid()) {
if (key.isAcceptable()) {
accept(key);
} else if (key.isReadable()) {
performReadInWorkerThread (key);
} else if (key.isWritable()) {
performWriteInWorkerThread (key);
}
}
}
}
あなたは、読み出し/書き込み可能なチャネルが選択されたコードスニペットから見ることができるように、私は選択のスレッドからの書き込み/読み取りをオフロードワーカースレッドに送信します。
ここで問題は、readbleチャンネルがワーカースレッドに渡され、チャンネルからの読み込みを終了する前に、選択スレッドが再びループし、selector.select()
がまだ選択されている読み取り可能なチャンネルを選択することです以前に割り当てられたワーカースレッドによってまだ完全に消費されていないチャネルの入力バッファ)、再びチャネルが別のワーカースレッドに引き渡され、ワーカースレッドが同じチャネルを読み取るとなります。
これは設計上の問題だと思います。私の質問は、同時に1つのスレッドだけがチャンネルを読むことを保証する方法です。
あなたが助けてくれるma回答の読んだ部分を参照してください。 – Amith
単純なファイルサーバーが必要な場合は、ブロックするNIOを使用するか、IOをブロックします。 IMHOこれはセレクタを使いこなすよりもずっと簡単です。 –