2017-04-10 97 views
0

我目前正在編寫一個小型的Java程序,我有一個客戶端向服務器發送命令。一個單獨的線程正在處理來自該服務器的回覆(回覆通常非常快)。理想情況下,我暫停發出服務器請求的線程,直到收到回覆或超出某個時間限制時爲止。如何使線程等待服務器響應

我目前的解決辦法是這樣的:

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(); 
    } 
} 

的主要問題是:此代碼拋出時一切都會好起來,因爲它應該和終止時,壞事發生異常。什麼是解決這個問題的好方法?

+0

幾種解決方案,在這個線程可用:http://stackoverflow.com/questions/289434/如何讓一個Java線程等待另一個線程輸出?rq = 1 –

+2

如果發送消息的線程需要等待響應,爲什麼要等待另一個線程上的響應?無論如何,你必須在同一個線程中進行操作。如果線程僅用於睡眠,則線程無用。無論如何,它拋出了什麼異常? – RealSkeptic

+0

它大致上與[如何在Java中異步執行POST REST調用]相同(http://stackoverflow.com/questions/43268903/how-to-make-a-post-rest-call-asynchronously -in-java的)。用遠程呼叫替換HTTP部分。 – andih

回答

3

有多個併發基元允許您實現線程通信。您可以使用CountDownLatch來實現類似的結果:

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

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

初始化鎖存器發送請求如下之前:

latch = new CountDownLatch(1); 
+0

的例子。謝謝,這完美的訣竅。 – Heijne