2013-04-25 27 views
0

我有一個問題,的Java聽插槽,同時檢查時間

我的客戶需要從特定的時間量的服務器聽,如果它沒有在那個時候接收來自服務器的回覆它有關閉連接。

我在客戶端有兩個線程,一個在時間過期後將布爾變量更新爲false,另一個線程從服務器以及計時器檢查msg。

我的代碼是這樣的:

while(true){ 
    if(l=is.readLine().equals(msg)) 
    { 
     // do processing 
     break; 
    } 
    if(timer) 
     break; 
} 

所以我while循環continuoslu檢查味精和定時器。 問題是,.readline()阻塞了這個調用,並且正在無限期地等待來自服務器的消息。

我該如何去做。

我試圖

if(l=is.readLine()!=null and l.equals(msg)) 

,但沒有工作。

回答

0

謝謝大家傢伙...

我發現了一個簡單的解決這個問題?

林檢查是否有在緩衝區數據調用的ReadLine

if(ir.ready()) 
    ir.readLine() 

的abouve只有當它的非阻塞將調用的readLine之前。

0

爲服務器偵聽器創建一個新線程。如果新線程從服務器接收到輸入,請設置內部切換。

在您的主線程中,啓動一個等待連接超時或服務器線程連接的循環。如果連接,則處理服務器的輸入。如果沒有,並且超時,請殺死線程(並可能關閉連接)。

+0

所以我必須有另一個線程除了監聽器和定時器?無論如何,我可以檢查在同一個線程中的兩個條件? – 2013-04-25 07:39:05

+0

你可以把定時器放在你的主線程中 - 只要確保它不佔用CPU。服務器連接進入它自己的線程,因此如果需要它可以被終止。 – Zyerah 2013-04-25 07:39:58

+0

即使我有我的計時器在主線程,我需要2個線程onr切換如果我收到一個味精和其他檢查哪一個滿意(收到味精或定時器過期)ryt? – 2013-04-25 07:43:09

-1

您可以使用CountdownLatch達到此目的。開始的網線,然後調用等待上倒計時鎖:

CountDownLatch latch = new CountDownLatch(1); 

// start network thread 
networkThread.start(); 

boolean wasFinished = latch.await(you_timeout); 

// Interrupt network thread as it still waiting: 
if(!wasFinished) { 
    networkThread.interrupt(); 
} 

在網絡線程讀取更迭後調用latch.countDown();

+0

'readLine'不會因爲中斷而出現。它仍然會被阻止。 http://stackoverflow.com/questions/3595926/how-to-interrupt-bufferedreaders-readline – Jatin 2013-04-25 07:54:58

1

你可以檢查這兩個條件,但是這比有一個線程輪詢你的連接並關閉已超時的線程要複雜得多。

即有一個線程每秒醒來並調用連接列表中每個連接的checkTimeout()方法。如果checkTimeout檢測到超時已經達到,它會設置一個closed = true;易失性標誌,並關閉()連接。如果拋出異常,如果在連接關閉後發生異常,我將忽略它。

您可以使用SocketTimeout,但在所有平臺上這並不總是按預期方式工作。請參閱Socket.setSoTimeout(timeinSECONDS);

+0

+1輪詢是最好的在給定的情況下 – Jatin 2013-04-25 07:57:28

+0

我認爲@ashish意味着他能夠建立連接,但寧可等待輸入。 'checkTimeout'將等待連接建立 – Jatin 2013-04-25 08:04:54

+0

@Jatin你可能是對的,但這樣的checkTimeout可以檢查你需要什麼。 – 2013-04-25 08:06:40

0

在給定的情況下,我認爲輪詢是@Peter所說的最佳選擇。 但是人們也可以使用2個線程做到這一點:

NetworkThread implements Runnable, Closeable{ 
BufferedReader r; 
volatile boolean readyToClose = false; 
@Override 
public void run(){ 
//initialize r as t = new BufferedReader(new InputStreamReader(socket.getInputStream())) 
String s = null; 
while((s= r.readLine())!=null){ 
    readyToClose = true; 
//do whatever 
} 
} 
public void close() throws IOException 
{ 
    if(readyToClose() 
    r.close(); 
} 
} 

有將被阻止在該持續時間(sleep)另一個線程。然後將撥打NetworkThread#close()。這將關閉流,另一個線程將從循環中退出。