【问题标题】:Stop Java thread which call JNI function停止调用 JNI 函数的 Java 线程
【发布时间】:2013-01-22 17:54:50
【问题描述】:

这里我想停止我的线程或杀死我的线程,它是在Java层上创建的,并且这个线程正在调用JNI函数。有时根据我的应用程序要求,我必须在某些条件下停止此 JNI 函数执行,否则不会。

new Thread(new Runnable() {
    @Override
    public void run() {
         // My jni function call, It calls my JNI layer C function.
         }
   }

现在,当这个线程执行开始并且它在 JNI 级别工作时,我不必担心,但是在某些情况下,我想从其他类或方法中停止这个 JNI 工作,那么我该如何停止这个线程。

注意:这里我的线程也没有while循环,所以我也不能检查一些全局标志变量。

那么有没有人知道如何在没有while循环的情况下调用任何JNI函数时杀死一个线程。

【问题讨论】:

标签: java android multithreading java-native-interface native


【解决方案1】:

本机“通过JNI调用”或纯Java代码没有什么特别之处,所有IO代码都使用JNI代码,您可以使用普通的Java线程方法停止它。

只需使用Thread.Stop() or Thread.Inturrupt()

【讨论】:

  • 你不能使用 Thread.stop() 因为它已被弃用,你也不能使用 Thread.interrupt() 因为它对 JNI 代码没有任何影响。 JVM 的 I/O 代码使用 Thread.interrupt()-aware JNI 代码,而不仅仅是“JNI 代码”。我不知道“所谓的 throw JNI”应该是什么意思。您的参考是非规范性和非权威性的。没有答案。
  • 据我了解,Native 代码最终将在 JVM 启动的同一线程中运行,因此对该线程执行任何操作都会影响其中使用的 JNI 代码。这个问题没有问到内存分配,所以我在回答问题时没有考虑它
  • @Mr.Me 中断在我的情况下也不起作用,因为应该有一个 while 循环来检查中断或不继续线程状态?我如何检查我的情况,没有 while 循环
  • 您不需要while循环来处理中断代码。中断将引发 InturruptException,如果未处理该异常,您的线程将被杀死
【解决方案2】:

最好不要突然杀死一个线程。 C 函数分配的资源可能不会被释放。

如果 C 函数正在等待某事,您可以触发条件返回并检查错误代码。

【讨论】:

    【解决方案3】:

    如果线程正在执行本机代码,您不能安全地中断线程。即使您的线程有一个事件循环,您也需要等到它完成本机调用。对您的代码一无所知,我猜您有一个长时间运行的本机调用,您不希望它阻塞主线程,因此您为该调用创建了一个单独的线程。您无法安全地中断单个本地调用。这里没有灵丹妙药。无论如何您都需要更改代码,我的建议是:

    • 将单个长原生调用分解为一系列短调用并在 Java 端运行事件循环
    • 在本机端内部分解本机调用并在本机端运行事件循环。您的本机界面将需要另一种方法来设置中断标志。

    Thread.interrupt() 不会帮助您,因为“调用本机函数”不属于 Javadoc 中指定的任何可中断操作。 Java 线程会继续运行,只是会设置中断状态

    【讨论】:

    • 感谢您的回答,但它的回答较晚,我已经使用您的第二种方式实现了线程中断,顺便说一句很好的建议。到目前为止,您的答案在其他答案中非常好。
    • 如果您觉得它“非常好”,请投票给它,以便它对未来的智慧寻求者更加可见和相关
    • 我来自未来并且可以确认:智慧被寻求。
    猜你喜欢
    • 2012-03-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多