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

时间:2014-06-26 06:14:34

标签: java multithreading interrupt

这个问题在此之前已被问过。我试图通过向他们学习来找出问题,但我仍然无法找到它的解决方案。我发布了一个带有中断问题的最小代码。我可能遗漏了一些东西非常愚蠢,你们可以帮助。

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但结果相同。

如果有人能够弄清楚什么是错的,或者正确的方法是什么,那将是非常有帮助的。

1 个答案:

答案 0 :(得分:1)

如果你打断了一个线程,你必须自己检查线程并执行退出逻辑 - 打断不会出现黑魔法"比如取消被打断的线程。

在套接字上中断阻塞读取主要是通过简单地关闭套接字结合一个try-catch-block结合读数并通过有序退出来对闭合套接字作出反应来完成。