Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/visual-studio-2012/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
线程中断()不中断java中的线程(UDP套接字)_Java_Multithreading_Interrupt - Fatal编程技术网

线程中断()不中断java中的线程(UDP套接字)

线程中断()不中断java中的线程(UDP套接字),java,multithreading,interrupt,Java,Multithreading,Interrupt,这个问题以前在这里被问过。我试图通过向他们学习来解决这个问题,但仍然找不到解决方法。我发布了一个关于中断问题的最小代码。我可能错过了一些非常愚蠢的东西,你们可以帮我解决 import java.io.IOException; import java.net.DatagramPacket; import java.net.InetAddress; import java.net.MulticastSocket; import java.net.UnknownHostException; publ

这个问题以前在这里被问过。我试图通过向他们学习来解决这个问题,但仍然找不到解决方法。我发布了一个关于中断问题的最小代码。我可能错过了一些非常愚蠢的东西,你们可以帮我解决

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,使用上述代码,但结果相同


如果有人能找出错误或正确的方法,这将非常有帮助。

如果你中断了一个线程,你必须自己检查线程并执行退出逻辑-中断没有取消中断的线程那样的“黑魔法”


中断套接字上的阻塞读取通常是通过简单地关闭套接字,并结合跨越读取的try-catch块,然后通过有序退出对关闭的套接字作出反应来完成的。

您能告诉我什么是“跟踪”以及您在哪里初始化了它吗?我不知道您的完整场景,但这可能会有所帮助。更新了问题。我确实检查了while循环中的线程是否中断,并尝试退出线程。我想在关闭套接字时,它应该执行一个循环,检查中断状态并退出。或者我是否遗漏了什么。是的,您遗漏了“此方法阻塞,直到收到数据报”这一点(这基本上意味着对interrupted的检查执行一次,然后调用阻塞,直到接收到某个内容后才会退出。但是为什么不从主线程关闭套接字并不会解除对接收的阻塞。这可能与此有关?