【问题标题】:Thread interrupt() not interrupting the thread in java (UDP Socket)线程中断()不中断java中的线程(UDP Socket)
【发布时间】:2014-08-16 21:30:51
【问题描述】:

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

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();
}

}

这里也是我从父线程调用中断的代码sn-p。

if(track.isAlive())
                {
                    //if(socket!=null)
                    //{
                        socket.close();
                    //}
                    track.interrupt();
                    //track.stop();
                }

track 被初始化为

tracker=new Optitrack(socket);
track=new Thread(tracker);
track.start();

我基本上只是尝试关闭套接字中断接收函数,然后中断线程本身。我之前尝试过不中断接收函数,直接用上面的代码调用Thread.interrupt,但结果相同。

如果有人能找出问题所在或正确的方法是什么,那将是非常有帮助的。

【问题讨论】:

标签: java multithreading interrupt


【解决方案1】:

如果你中断一个线程,你必须自己签入线程并执行退出逻辑——中断不会像取消被中断的线程那样“黑魔法”。

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

【讨论】:

  • 我确实检查了线程是否在while循环内被中断并尝试退出线程。我想在关闭套接字时,它应该执行一个循环,检查中断状态并退出那里。或者我错过了什么吗?
  • 是的,您错过了“此方法在收到数据报之前阻塞”这一点(download.java.net/jdk7/archive/b123/docs/api/java/net/… 这基本上意味着您对中断的检查执行一次,然后调用阻塞并获胜'在收到东西之前退出。
  • 但是为什么不从主线程关闭套接字并不能解除接收阻塞。
  • 也许这是相关的? stackoverflow.com/questions/7962121/…
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-03-11
  • 2012-10-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-07-09
相关资源
最近更新 更多