Bitte zeigen Sie mir ein Arbeitsbeispiel von selector.wakeup();
Methode zwischen zwei Threads.java nio Selector weckup
Ich habe versucht, ein einfaches Programm zu erstellen, wo ein Thread auf selector.select() -Methode wartet. Der zweite Thread erstellt einige Sockets und versucht, sich mit dem Selektor zu registrieren. auf dem der erste Thread blockiert ist.
Daher muss ich Selectors wakeup
Methode verwenden, aber irgendwie kommt der erste Thread isnt nicht aus dem Sperrmodus.
Die Javadoc- der Wakeup-Methode bestimmt:
Wenn ein anderer Thread momentan in einem Aufruf des Selector.select() oder Selector.select (long) Methods dann kehrt dass Aufruf gesperrt sofort.
P.S Es gibt nur wenige andere Arbeitsumgebungen; Einer von ihnen ist ausgewählt (Timeout), aber ich versuche herauszufinden, wo der Fehler liegt.
Der Pseudocode:
erster Thread:
static Selector selector = Selector.open();
while(true) {
int n = selectorGlobal.select();
selectorKeySet = selectorGlobal.selectedKeys().iterator();
while (selectorKeySet.hasNext()) {
selectionKey = selectorKeySet.next();
if (selectionKey.isReadable()) {
//do something
}
if(selectionKey.isAcceptable()) {
//accept
}
}
}
zweiter Thread:
while (itr.hasNext()) {
data = (String) itr.next();
String IP = data.get(0);
String Port = data.get(1);
SocketChannel socketChannel = SocketChannel.open();
socketChannel.configureBlocking(true);
boolean isConnected = socketChannel.connect(new InetSocketAddress(IP, Port));
ClassName.selector.wakeup();
SelectionKey selectionKey = SelectSockets.registerChannel(ClassName.selector,
socketChannel, SelectionKey.OP_READ);
}
Danke Seth.Eine Verbindung zu anderen Sockets ist eine Aktivität, die sehr selten passieren würde; daher wünschte ich mir, dass der Selektor-Thread nicht jedes Mal eine Sammlung/Variable überprüfen würde, wenn es eine Aktivität auf den Auswahltasten gibt. – Nilesh