2017-04-10 1 views
0

Ich schreibe gerade ein kleines Java-Programm, wo ich einen Client habe, der Befehle an einen Server sendet. Ein separater Thread beschäftigt sich mit Antworten von diesem Server (die Antwort ist normalerweise ziemlich schnell). Idealerweise pausiere ich den Thread, der die Serveranfrage gestellt hat, bis die Antwort empfangen wird oder bis ein Zeitlimit überschritten wird.Wie man einen Thread auf eine Serverantwort warten lässt

Meine aktuelle Lösung sieht wie folgt aus:

public void waitForResponse(){ 
    thisThread = Thread.currentThread(); 
    try { 
     thisThread.sleep(10000); 
     //This should not happen. 
     System.exit(1); 
    } 
    catch (InterruptedException e){ 
     //continue with the main programm 
    } 
} 

public void notifyOKCommandReceived() { 
    if(thisThread != null){ 
     thisThread.interrupt(); 
    } 
} 

Das Hauptproblem ist: Dieser Code führt eine Ausnahme aus, wenn alles, wie es sollte sich geht, und endet, wenn etwas Schlimmes passiert. Was ist ein guter Weg, um das zu beheben?

+0

Mehrere Lösungen sind in diesem Thread zur Verfügung: http://stackoverflow.com/questions/289434/ how-to-make-a-java-thread-wait-for-another-threads-output? rq = 1 –

+2

Wenn der Thread, der die Nachricht sendet, auf die Antwort warten muss, warum warten Sie auf die Antwort in einem anderen Thread ? Mach es im selben Thread, da musst du sowieso warten. Ein Thread ist nutzlos, wenn er nur zum Schlafen verwendet wird. Wie auch immer, welche Ausnahme wirft es? – RealSkeptic

+0

Es ist mehr oder weniger dasselbe wie in [Wie man einen POST-REST-Aufruf asynchron in Java durchführt] (http://stackoverflow.com/questions/43268903/how-to-make-a-post-rest-call-asynchronous) -in-Java). Ersetzen Sie den HTTP-Teil durch Ihren Remote-Aufruf. – andih

Antwort

3

Es gibt mehrere Parallelitätsprimitive, mit denen Sie Thread-Kommunikation implementieren können. Sie können CountDownLatch verwenden ähnliches Ergebnis zu erreichen:

public void waitForResponse() { 
    boolean result = latch.await(10, TimeUnit.SECONDS); 
    // check result and react correspondingly 
} 

public void notifyOKCommandReceived() { 
    latch.countDown(); 
} 

initialisieren verriegeln, bevor Anfrage zu senden, wie folgt:

latch = new CountDownLatch(1); 
+0

Danke, das macht den Trick perfekt. – Heijne

Verwandte Themen