Nic*_*men 5 java networking multithreading interrupt-handling
毫无疑问,这个问题过去曾以各种形式被提出过,但针对特定场景却没有那么多。
停止等待通过 UDP 接收网络消息时阻塞的线程的最正确方法是什么。
例如,假设我有以下主题:
public class ClientDiscoveryEngine extends Thread {
private final int PORT;
public ClientDiscoveryEngine(final int portNumber) {
PORT = portNumber;
}
@Override
public void run() {
try {
socket = new DatagramSocket(RECEIVE_PORT);
while (true) {
final byte[] data = new byte[256];
final DatagramPacket packet = new DatagramPacket(data, data.length);
socket.receive(packet);
}
} catch (SocketException e) {
// do stuff 1
} catch (IOException e) {
// do stuff 2
}
}
}
Run Code Online (Sandbox Code Playgroud)
现在,更正确的方法是使用该interrupt()方法吗?例如添加以下方法:
@Override
public void interrupt() {
super.interrupt();
// flip some state?
}
Run Code Online (Sandbox Code Playgroud)
我唯一关心的是,是socket.receive()不是一种不可中断的阻塞方法?我想到的一种方法是在该方法调用中实现上面的中断方法socket.close(),然后run在SocketException. 或者也许不while(true)使用在中断方法中翻转的某些状态。这是最好的方法吗?或者有更优雅的方式吗?
谢谢
接收方法似乎不可中断。您可以关闭套接字:javadoc 说:
当前阻塞在该套接字上的任何线程
receive(java.net.DatagramPacket)都会抛出 SocketException
您还可以用来setSoTimeout使接收方法仅阻塞一小段时间。该方法返回后,您的线程可以检查它是否已被中断,并在这段时间内再次重试接收。
| 归档时间: |
|
| 查看次数: |
2629 次 |
| 最近记录: |