java - 暂停通过 JNI 运行的 native C 代码

标签 java c java-native-interface signals

我正在运行一个 Java 应用程序,该应用程序又调用一些 C 代码。在 Java 中,我创建了一个线程,其唯一职责是执行对 C 代码的调用。

如何暂停 C 代码的执行?到目前为止,我已经花了一天的时间来研究它,但我不确定是否应该尝试在 Java 或 C 级别暂停。

下面我有调用public native String beginTest()的线程的java代码。

public void run() {
    int result = this.beginTest();
    AmpTester.setResponseValue(result);
}

为了简单起见,假设 JNI 接口(interface)和 native 方法定义如下:

JNIEXPORT jstring JNICALL Java_AmpTester_beginTest (JNIEnv *env, jobject obj){
    return startAmpTest();
}

以及我想要运行的实际 native 代码:

int startTest(){
    int i;
    for (i = 0; i < 1000; i++){
        printf("%i\n", i);
        sleep(1);
    }

    return 0;
}

最佳答案

Java 的 Thread.suspend() 可能(取决于 JVM,但我怀疑有人会这样实现它)不会起作用,但我也不推荐它。您可以使用操作系统的 SuspendThread功能,但我也不推荐这个。挂起线程是不好的:

Thread.suspend is inherently deadlock-prone. If the target thread holds a lock on the monitor protecting a critical system resource when it is suspended, no thread can access this resource until the target thread is resumed. If the thread that would resume the target thread attempts to lock this monitor prior to calling resume, deadlock results. Such deadlocks typically manifest themselves as "frozen" processes.

来源:Why are Thread.stop, Thread.suspend and Thread.resume Deprecated?

根据文档,Windows SuspendThread 函数主要是为调试器使用而设计的(出于类似的原因)。所以基本上答案是您不应该暂停任何代码的执行,包括您的 C 代码。

<小时/>

但是您可以使用独占锁/互斥体和全局变量来解决您的问题:在循环的每次迭代中,检查全局 volatile bool 变量是否仍为 true。如果不是,则获取锁,将其设置回 true,释放锁,然后继续迭代。

您的 suspend() 函数将如下所示:获取锁并将变量设置为 false

您的 resume() 函数将如下所示:释放锁定。

您可以通过 JNI 调用这些函数。

示例: native 方法正在迭代(线程 A)。现在线程 B 调用 suspend()。它获取锁并更改变量。现在线程 A 注意到了这一点,并且在获取锁的过程中等待,直到线程 B 释放它。最后线程B调用resume()并释放锁。现在线程 A 获取它,更改值,释放它并继续迭代。

关于java - 暂停通过 JNI 运行的 native C 代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18001583/

相关文章:

java - Portlet 与 Servlet : why there is only Service phase in servlet and Action and render phase in portlet for request handling?

java - 为什么 Spongy CaSTLe 忽略 bcpg 和 openpgp 包

c - 使用 ICU C API 显示区域设置货币符号?

c - 死 C 变量

java - 为什么myeclipse控制台没有输出?

java - 命令行中的命令行参数与 IDE 中的命令行参数

java - 如何获取树表的选定行?

c - 测试用例未在 C 程序中运行

java - JNI - 如何将 jshortArray 转换为短 *

android - 使用 JNI 时实例和类变量状态的问题