【问题标题】:How can I stop thread containing blocking operation?如何停止包含阻塞操作的线程?
【发布时间】:2019-09-02 16:08:15
【问题描述】:

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

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

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

我怎样才能阻止它?

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

【问题讨论】:

  • 代码,你有完整的部分吗?整个包含类或源链接?
  • 现在不抱歉,但我猜唯一有趣的部分是那里(我真的尝试了一切)。
  • 如果Thread#stop 未被弃用,您能否展示一些代码?另外,使用breakLoop有什么问题?
  • 如果stop 未被弃用,我会从主线程调用它,然后将过滤器应用到我的pcaphandle 并启动一个新线程。关于breakloop 方法,它返回一个InterruptedException
  • 我发现了一些我认为您正在使用的库,顺便说一下,它有 API 和可用的源代码。如果我们看不到库或用例细节,我们无法为您提供帮助?任何时候线程都可以被中断,这就是被抛出的异常。

标签: java multithreading loops blocking pcap4j


【解决方案1】:

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

【讨论】:

  • 谢谢,但问题是中断方法除了更改布尔值 Thread.isInterrupted() 之外没有其他效果,这在我的情况下是无用的。
  • 为什么不呢?抛出的那个异常是为了那个?你试过了吗?
  • 现在我想知道我是否尝试拨打 interrupt 然后拨打 breakloop(我承认这很荒谬)我会在明天(法国 1 点 34 分)尝试,但谢谢大家。跨度>
  • 我看到了你的编辑,我将把它发布到他们的 github 上,非常感谢你的工作。
猜你喜欢
  • 2013-07-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-05-10
  • 1970-01-01
  • 2012-09-01
  • 1970-01-01
相关资源
最近更新 更多