我有以下代码:
public class ServerConnectionListener implements Runnable {
DatagramSocket receiveSocket;
DatagramPacket receivePacket;
/*
Some Initilization here in the constructor
//
//
*/
@Override
public void run()
{
try {
System.out.println("Waiting..."); // so we know we're waiting
receiveSocket.receive(receivePacket);
} catch (IOException e)
{
System.out.print("IO Exception: likely:");
e.printStackTrace();
System.exit(1);
}
//Some more stuff to be done here
}
}
我知道receiveSocket.receive()是一个阻塞调用。因此,我想以这样一种方式使用Thread.currentThread()。isInterrupted(),它允许我中断这个线程,而不必等待接收数据包。
答案 0 :(得分:1)
您无法安全地中断在套接字接收上被阻止的线程。
实现此目的的简单方法是设置合理的超时值(DatagramSocket.setSoTimeout(int milliseconds)
),即1秒,并检查每个SocketTimeoutException
上的中断标志。
更好但更复杂(从编码的角度来看)解决方案是使用java.nio.channels
的设施。