1

我正在研究数据包嗅探器,但我在停止包含阻塞方法的线程(不推荐使用的方法)的方式上遇到了麻烦。

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

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

我怎样才能阻止它?

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

4

1 回答 1

2

使用Thread#getAllStackTraces您可以获得所有线程。SO 对此还有其他一些答案,以获取线程。找到线程后,您可以中断它。也有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();
            }
        }
    }
}

于 2019-04-11T23:16:16.663 回答