【问题标题】:Java : How to stop a Thread that's calling a succession of C++ functions using a JNI function?Java:如何停止使用 JNI 函数调用一系列 C++ 函数的线程?
【发布时间】:2012-03-26 21:30:20
【问题描述】:

所以,这是我的情况:

我有一个 Java 应用程序,它使用“JavaToCpp”类中的 JNI 方法将数据数组发送到 C++ DLL。

一旦 C++ DLL 接收到所有数据,它就会开始对其执行多项操作。

我正在使用新线程运行“JavaToCpp”类,因为我的 Java 接口在(长)(C++)过程/子例程期间不会被冻结。

我实现了两种方法来停止工作 (C++) 过程/子例程:

  • 第一个“STOP”:正在创建一个将由 C++ DLL 读取的文件,以便它可以干净地停止正在运行的过程/子例程。
  • 第二个“KILL”:应该直接关闭/杀死正在运行的 C++ 过程/子例程

问题是,找了一阵子,也没找到什么好办法。

所以如果有人知道如何在程序/子例程运行时杀死线程......

【问题讨论】:

    标签: java multithreading java-native-interface kill


    【解决方案1】:

    在 Java 中“杀死”线程的唯一方法是 已弃用 stop() 方法。

    在您打算使用它之前,请阅读并理解why it's deprecated。懂了就不会用了。

    所以不,没有杀死线程的好方法。但是您为什么要谈论 C++ processes(或者您的意思是过程,即子例程)?因为如果您使用单独的进程(不是线程)来执行本机部分,您可以轻松停止它:使用ProcessBuilderProcess.destroy()。使用进程而不是线程来调用本机内容还有其他优点。一个好处是不稳定的本机进程不会杀死您的 Java 进程。

    【讨论】:

    • 是的,抱歉,我的意思是“程序/子程序”。使用“进程”调用我的 C++ DLL 会以同样的方式工作吗? (我假设它会使用更多内存,并且我的资源不会与 Dll 共享(例如,我必须从我的 C++ DLL 调用 Java 方法以将结果附加到 Java GUI)
    • @Kuroicloud666:JNI 仅映射同一进程内的调用。如果您使用单独的进程,则必须使用一些进程间通信机制,例如 TCP/IP 套接字(可能更容易)或管道(可能更快)甚至临时文件(在某些情况下可能很好)。所以在这些之间切换并不容易,这是一个基本的设计决策。
    【解决方案2】:

    最佳实践方法是使用 volatile 变量,由长时间运行的任务检查以确定何时停止。您可以使用Thread.currentThread().isInterrupted() 标志。

    问题是你想杀死大多数线程,因为它们表现不佳。在这种情况下,您唯一的选择是终止进程,这通常意味着首先在不同的进程中启动它。

    【讨论】:

    • 问题是我不指望我的 C++ 库从我的 Java 应用程序中获得任何新价值。对于这种情况,你在说我,我已经有了解决方案。我需要知道的是是否有办法删除/杀死/停止线程(以及正在运行的 C++ 进程)...
    • 您需要向将杀死线程的进程发出信号。杀死单个线程是不安全的,因为线程共享内存、锁、文件等资源。
    猜你喜欢
    • 2013-01-22
    • 2023-04-09
    • 1970-01-01
    • 1970-01-01
    • 2017-12-02
    • 1970-01-01
    • 2020-11-11
    • 2012-01-29
    • 1970-01-01
    相关资源
    最近更新 更多