繁体   English   中英

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

[英]Thread interrupt() not interrupting the thread in java (UDP Socket)

这个问题以前曾被问过。我试图通过向他们学习来找出问题,但仍然找不到解决方案。我在发布带有中断问题的最小代码。你们也许可以提供帮助。

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-block跨越读取范围并通过有序退出对已关闭的套接字作出反应来完成的。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM