java:如何停止使用JNI函数调用C++函数的线程?

java:如何停止使用JNI函数调用C++函数的线程?,java,multithreading,java-native-interface,kill,Java,Multithreading,Java Native Interface,Kill,因此,我的情况如下: 我有一个java应用程序,它使用JavaTopp类的JNI方法将数据数组发送到C++ DLL。 一旦C++ DLL接收到所有数据,它就开始执行它的几个动作。 我使用一个新线程运行JavaTopp类,因为java接口在长C++程序/子程序期间不会被冻结。 我实现了两种方法来停止工作的C++程序/子程序: 第一个停止:创建一个文件,它将被C++ DLL读取,这样它可以干净地停止运行的程序/子程序。 第二个杀手:直接关闭/杀死运行的C++程序/子程序 问题是,在寻找了一段时间后,

因此,我的情况如下:

我有一个java应用程序,它使用JavaTopp类的JNI方法将数据数组发送到C++ DLL。 一旦C++ DLL接收到所有数据,它就开始执行它的几个动作。

我使用一个新线程运行JavaTopp类,因为java接口在长C++程序/子程序期间不会被冻结。

我实现了两种方法来停止工作的C++程序/子程序:

第一个停止:创建一个文件,它将被C++ DLL读取,这样它可以干净地停止运行的程序/子程序。 第二个杀手:直接关闭/杀死运行的C++程序/子程序 问题是,在寻找了一段时间后,我没有找到任何好的技巧来完成它


因此,如果有人知道如何在程序/子例程运行时终止线程…

最佳做法是使用一个易失性变量,该变量由长时间运行的任务检查,以确定何时停止。您可以使用Thread.currentThread.isInterrupted标志


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

最佳做法是使用一个可变变量,由长时间运行的任务检查该变量,以确定何时停止。您可以使用Thread.currentThread.isInterrupted标志


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

在Java中终止线程的唯一方法是不推荐使用的方法

在你计划使用它之前,先阅读并理解它。如果你理解它,你就不会使用它


所以,没有好的方法可以杀死线程。但是为什么你要谈论C++进程呢?还是指程序,即子程序?因为如果您使用一个单独的进程而不是线程来完成本机部分,您可以很容易地停止它:使用和。使用进程而不是线程来调用本机内容还有其他好处。一个好处是不稳定的本机进程不会杀死Java进程。

在Java中杀死线程的唯一方法是不推荐使用的方法

在你计划使用它之前,先阅读并理解它。如果你理解它,你就不会使用它


所以,没有好的方法可以杀死线程。但是为什么你要谈论C++进程呢?还是指程序,即子程序?因为如果您使用一个单独的进程而不是线程来完成本机部分,您可以很容易地停止它:使用和。使用进程而不是线程来调用本机内容还有其他好处。一个好处是不稳定的本地进程不会杀死java进程。< / P> >我不指望C++库从java应用程序中获得任何新的值。你说的这个案子,我已经有了解决办法。我需要知道的是,如果有一种方法可以删除/杀死/停止线程,因此运行的C++进程……您需要发出信号,该进程将杀死线程。当线程共享内存、锁、文件等资源时,杀死一个单独的线程是不安全的。问题是,我不指望我的C++库从java应用程序中获得任何新的值。你说的这个案子,我已经有了解决办法。我需要知道的是,如果有一种方法可以删除/杀死/停止线程,因此运行的C++进程……您需要发出信号,该进程将杀死线程。杀死单个线程是不安全的,因为线程共享内存、锁、文件等资源。是的,对不起,我指的是过程/子例程。使用进程调用C++的DLL会起到同样的作用吗?我假设它会使用更多的内存,并且我的RESoSts不会与Dll共享,例如,我必须从我的C++ DLL调用java方法,将结果附加到java GUI @ KuoRiCuLD666:JNI只映射同一进程内的调用。如果使用单独的进程,则必须使用一些进程间通信机制,例如TCP/IP套接字可能更容易,管道可能更快,甚至在某些情况下临时文件也可以。所以在这两者之间切换并不容易,这是一个基本的设计决策。是的,对不起,我指的是程序/子程序。使用进程调用C++的DLL会起到同样的作用吗?我假设它会使用更多的内存,并且我的RESoSts不会与Dll共享,例如,我必须从我的C++ DLL调用java方法,将结果附加到java GUI @ KuoRiCuLD666:JNI只映射同一进程内的调用。如果使用单独的进程,则必须使用一些进程间通信机制,例如TCP/IP套接字(可能更容易)或管道(可能更容易) 在某些情况下,更快甚至是临时文件都可以。所以在这两者之间切换并不容易,这是一个基本的设计决策。