Ich implementiere einen einfachen Dateiserver mit Java NIO mit einem auswählenden Thread und mehreren Worker-Threads (um echtes Lesen/Schreiben durchzuführen).Java NIO SocketChannel.read() mit Multithread
Der Hauptteil des Codes sieht wie folgt aus:
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);
}
}
}
}
Wie man aus dem Code-Schnipsel sehen kann, wenn ein lesbarer/beschreibbares Kanal ausgewählt wird, abzuladen I die Lese-/Schreib von der Auswahl Gewinden zu einem Worker-Thread.
Jetzt ist das Problem, dass, wenn ein lesbarer Kanal an den Arbeiterthread übergeben wird, und bevor es aus dem Kanal liest/beginnt, der Auswahlfaden wiederholt wird und selector.select()
den zuvor ausgewählten lesbaren Kanal auswählt (weil es immer noch gibt Eingabepuffer in dem Kanal, der noch nicht vollständig von dem zuvor zugewiesenen Worker-Thread belegt wurde), so dass der Kanal erneut an einen anderen Worker-Thread übergeben wird, was zu mehreren Worker-Threads führt, die den gleichen Kanal lesen.
Ich glaube, das ist ein Design-Problem. Meine Frage ist, wie kann ich sicherstellen, dass nur ein Thread gleichzeitig einen Kanal liest?
refer ma für den Leseabschnitt von ma Antwort, die Ihnen helfen kann – Amith
Wenn Sie einen einfachen Dateiserver wollen, würde ich Blockierung NIO oder Blockierung IO verwenden. IMHO Dies ist viel einfacher als mit Selektoren herumzualbern. –