2

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

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

下面我有调用public native String beginTest().

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

为简单起见,假设 JNI 接口和本地方法定义如下:

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

我要运行的实际本机代码:

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

    return 0;
}
4

1 回答 1

0

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

Thread.suspend 天生就容易死锁。如果目标线程在暂停时对保护关键系统资源的监视器持有锁,则在目标线程恢复之前没有线程可以访问该资源。如果将恢复目标线程的线程在调用 resume 之前尝试锁定此监视器,则会导致死锁。这种死锁通常表现为“冻结”进程。

资料来源:为什么不推荐使用 Thread.stop、Thread.suspend 和 Thread.resume?

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


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

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

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

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

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

于 2013-08-02T11:54:29.663 回答