5

在这里,我想停止我的线程或杀死我在 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函数时杀死一个线程。

4

3 回答 3

12

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

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

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

于 2013-02-11T14:44:48.370 回答
2

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

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

于 2013-02-07T10:29:53.393 回答
-3

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

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

于 2013-02-07T09:59:11.973 回答