2016-04-05 9 views
0

Ich habe sequentiellen Single-Threaded-Algorithmus wie diese jetzt schreiben:Wie multithreaded Algorithmus zur Entdeckung verfügbar Buchse

boolean conn = false; 

for (InetSocketAddress addr : addrs) { 
    while (!conn) { 
     SocketChannel ch = SocketChannel.open(); 
     ch.configureBlocking(true); 
     ch.socket().setTcpNoDelay(tcpNoDelay); 
     ch.socket().setKeepAlive(true); 

     try { 
      ch.socket().connect(addr, connTimeout); 
      conn = true; 
      .... 
     } 
     catch (...) { 
      log("Not available: " + addr); 
     } 

     if (conn) 
     break; 
    } 
} 

Aber in manchen Situationen konnte ich in der seine recht große Liste von Adressen und verfügbare Adresse haben könnte Ende dieser Liste - dies führt zu einer langsamen Erkennung der verfügbaren Adresse, da ich alle Adressen einzeln überprüfen muss.

Also meine Frage - wie könnte ich Algorithmus implementieren, der versuchen wird, mit mehreren Adressen aus verschiedenen Threads zu verbinden und wird beendet, sobald die erste verfügbare Adresse gefunden wird?

Auch dieser Algorithmus sollte beendet werden, wenn keine Adresse verfügbar ist.

Irgendwelche Ideen, wie man das kodiert?

+0

http://tutorials.jenkov.com/java-nio/selectors.html –

+0

ähnliches Thema http://stackoverflow.com/questions/36397158/java-multithreading-sockets/36398341#36398341 – pdem

Antwort

0

Führen Sie alle Verbindungen im nicht blockierenden Modus durch und verwenden Sie dann Selector unter OP_CONNECT, um herauszufinden, wann und ob die Verbindungen erfolgreich sind.

+0

meinen Sie, dass alle meine "100" -Adressen werden verbunden, falls sie alle verfügbar sind? Ich brauche nur zuerst erfolgreich – kuaw26

+0

Das ist richtig. Sie können nicht herausfinden, ob Sie eine Verbindung herstellen können, ohne eine Verbindung herzustellen. Alternativ können Sie versuchen, die Zeitüberschreitung zu verkürzen. – EJP

+0

@ kuaw26, entweder wollen Sie die erste - als Sie es sequenziell tun müssen - oder Sie wollen "eine der verfügbaren" - als nicht blockieren. Wähle eins. – SergeyA