1つの選択スレッドと複数のワーカースレッド(実際の読み取り/書き込みを実行するため)を備えたJavaNIOを使用して単純なファイルサーバーを実装しています。
コードの主要部分は次のようになります。
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);
}
}
}
}
コードスニペットからわかるように、読み取り/書き込み可能なチャネルが選択されている場合、読み取り/書き込みを選択スレッドからワーカースレッドにオフロードします。
ここで問題となるのは、読み取り可能なチャネルがワーカースレッドに渡され、チャネルからの読み取りが終了/開始する前に、選択スレッドが再びループし、selector.select()
以前に選択された読み取り可能なチャネルを選択することです(チャネルに入力バッファーがまだあるため)これは、以前に割り当てられたワーカースレッドによってまだ完全には消費されていません)。そのため、チャネルは別のワーカースレッドに渡され、複数のワーカースレッドが同じチャネルを読み取ります。
これは設計上の問題だと思います。私の質問は、1つのスレッドだけが同時にチャネルを読み取るようにするにはどうすればよいですか?