gpt4 book ai didi

java - 停止线程等待网络 Activity 的正确方法是什么?

转载 作者:搜寻专家 更新时间:2023-11-01 01:37:52 24 4
gpt4 key购买 nike

毫无疑问,过去曾以各种形式提出过这个问题,但针对特定场景的问题并不多。

在等待通过 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
}
}
}

现在,更正确的方法是使用 interrupt() 方法吗?例如添加以下方法:

@Override
public void interrupt() {
super.interrupt();
// flip some state?
}

我唯一担心的是,socket.receive() 不是不可中断的阻塞方法吗?我想到的一种方法是实现上面的中断方法,在该方法中调用 socket.close() 然后在 run 方法中满足它在捕获 SocketException 时。或者可能不是 while(true) 使用一些在中断方法中翻转的状态。这是最好的方法吗?还是有更优雅的方式?

谢谢

最佳答案

receive 方法似乎不可中断。您可以关闭套接字:javadoc 说:

Any thread currently blocked in receive(java.net.DatagramPacket) upon this socket will throw a SocketException

您还可以使用 setSoTimeout 使接收方法仅阻塞一小段时间。方法返回后,您的线程可以检查它是否已被中断,并在这段小时间内重试再次接收。

关于java - 停止线程等待网络 Activity 的正确方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7132275/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com