这个问题在此之前已被问过。我试图通过向他们学习来找出问题,但我仍然无法找到它的解决方案。我发布了一个带有中断问题的最小代码。我可能遗漏了一些东西非常愚蠢,你们可以帮助。
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.InetAddress;
import java.net.MulticastSocket;
import java.net.UnknownHostException;
public class Optitrack implements Runnable {
private MulticastSocket s;
public Optitrack(MulticastSocket socket) {
// SOcket acquired from parent
this.s = socket;
}
public void start_track() {
InetAddress group;
try {
group = InetAddress.getByName("xx.xx.xx.xx");
s = new MulticastSocket(1511);
s.joinGroup(group);
} catch (UnknownHostException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
} catch (IOException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
System.out.println("Have we joined the multicast group?");
while (true) {
// get their responses!
if (Thread.currentThread().isInterrupted()) {
Thread.currentThread().interrupt();
return;
}
DatagramPacket recv = new DatagramPacket(buf, buf.length);
try {
s.receive(recv);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
// Some calculations and functions here which are not important to
// the problem
}
}
@Override
public void run() {
// TODO Auto-generated method stub
start_track();
}
}
此处还有代码片段,我从父线程调用中断。
if(track.isAlive())
{
//if(socket!=null)
//{
socket.close();
//}
track.interrupt();
//track.stop();
}
跟踪初始化为
tracker=new Optitrack(socket);
track=new Thread(tracker);
track.start();
我基本上只是试图关闭套接字来中断接收函数然后中断线程本身。我之前尝试过不中断接收函数并直接用上面的代码调用Thread.interrupt但结果相同。
如果有人能够弄清楚什么是错的,或者正确的方法是什么,那将是非常有帮助的。
答案 0 :(得分:1)
如果你打断了一个线程,你必须自己检查线程并执行退出逻辑 - 打断不会出现黑魔法"比如取消被打断的线程。
在套接字上中断阻塞读取主要是通过简单地关闭套接字结合一个try-catch-block结合读数并通过有序退出来对闭合套接字作出反应来完成。