2011-03-17 55 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!"); 
}