2011-03-17 88 views
2

我正在查看創建線程以處理每個傳入連接的服務器的代碼。問題在於,由於某些原因,在一堆線程中,從套接字創建的DataInputStream掛在readByte上,沒有拋出任何異常。超時設置爲60秒,所以我不確定下一步是什麼。DataInputStream readByte被阻止/掛起

socket.setSoTimeout(timeout); 
socketInputStream = socket.getInputStream(); 
byte connectionOptions = socketDataInputStream.readByte(); 
+0

您確定有一個字節可讀? 'available()'返回大於0嗎? – WhiteFang34 2011-03-17 09:48:54

+0

@mohamed你是什麼意思?我很確定套接字只能由1個線程處理,並且它只是坐在readByte上等待永久(無超時)。 – phobus 2011-03-17 10:12:45

回答

0

檢查死鎖的完整線程轉儲。
ctrl + break for windows。
ctrl + |kill -3 PID for linux。

或使用jvisualvmjconsole工具。

timeout值應該以毫秒爲單位。

+0

我相信OP期待SoTimeout在達到超時後觸發SocketException。 – 2011-03-17 09:45:15

+0

@peter:你說得對。 SocketTimeoutException ... – 2011-03-17 10:03:37

+0

是的,在jconsole中,我看到線程剛剛坐在第三行@ readByte - 但正如Peter所說,我正在等待SocketException並且它沒有發生 – phobus 2011-03-17 10:11:44

1

您在評論中指出,您正在等待SocketException。如果是這樣,你需要趕上SocketTimeoutException。例如,如果您telnet到端口3434並等待3秒,則此代碼將輸出timeout!

try { 
    ServerSocket ss = new ServerSocket(3434); 
    Socket socket = ss.accept(); 
    socket.setSoTimeout(3000); 
    InputStream socketInputStream = socket.getInputStream(); 
    DataInputStream dataInputStream = new DataInputStream(socketInputStream); 
    dataInputStream.readByte(); 
} catch (SocketTimeoutException e) { 
    System.out.println("timeout!"); 
}