如何停止包含阻塞操作的线程?

时间:2019-04-11 23:04:52

标签: java multithreading loops blocking pcap4j

我正在处理数据包嗅探器,但是在停止包含阻塞方法的线程(没有不推荐使用的方法)方面遇到麻烦。

有关的方法是pcap4j库中的loop()方法。因为它是一种阻塞方法,所以我将其放入线程中以保持主线程正常工作。但是,为了将过滤器应用于pcap接口,我必须中断循环并重新启动它,因为库的breakloop()函数返回了InterruptedException。所以我的想法是杀死包含该方法的线程。但是由于无法进入导致该方法阻塞的库循环,因此无法通过检查线程是否被中断来做到这一点。

Thread t = new Thread(new Runnable() {
    @Override
    public void run() {
        loop(args);
    }
});
t.start();

如何阻止它?

编辑:我要做的是从源代码重新编译库,从PcapHandle类中删除了InterruptedException。

1 个答案:

答案 0 :(得分:2)

使用Thread#getAllStackTraces,您可以获得所有线程。 SO Has a few other answers to this还可用于保持线程。找到线程后,您可以中断它。 Thread.class还有其他一些标识符也可能有助于找到线程。

编辑:您正在使用kaitoy / pcap4j吗?如果是这样的话,breakLoop()InterruptedException而言无能为力,那就是图书馆打算如何破坏它。如果他们需要实现功能,我会考虑在他们的github中提出问题。

import java.util.Set;

class TestStuff {

    public static void main(String[] args) {
        Set<Thread> threadSet = Thread.getAllStackTraces().keySet();
        for (Thread thread : threadSet) {
            if(thread.getName().equals("some-name")){
                thread.interrupt();
            }
        }
    }
}