Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 正常关闭执行本机代码的线程_Java_Multithreading_Native_Macos Carbon - Fatal编程技术网

Java 正常关闭执行本机代码的线程

Java 正常关闭执行本机代码的线程,java,multithreading,native,macos-carbon,Java,Multithreading,Native,Macos Carbon,在我的应用程序中,我有一个固定大小的ExecutorService 现在线程调用一些本机代码。在本机方法内部,它被阻塞并等待需要调度的操作系统事件。问题在于执行器服务的正常关闭 如果我中断线程,那么线程仍然不会出现(显然)。如果我将线程设置为守护进程。但它仍然不允许JVM关闭。我仅有的工作代码是使用系统。退出,原因很明显,我不打算使用。还有其他解决方法吗?错误在于本机代码没有返回。据我所知,通过更高级别的java实现这一点的唯一方法是使用线程,这是不推荐使用的 为此,您需要重新设计以使用老式的线

在我的应用程序中,我有一个固定大小的
ExecutorService

现在线程调用一些本机代码。在本机方法内部,它被阻塞并等待需要调度的操作系统事件。问题在于
执行器服务的正常关闭


如果我中断线程,那么线程仍然不会出现(显然)。如果我将线程设置为
守护进程
。但它仍然不允许JVM关闭。我仅有的工作代码是使用
系统。退出
,原因很明显,我不打算使用。还有其他解决方法吗?

错误在于本机代码没有返回。据我所知,通过更高级别的java实现这一点的唯一方法是使用线程,这是不推荐使用的

为此,您需要重新设计以使用老式的
线程
,而不是
执行器服务
。您也可以这样做,因为大小固定为1,因此
ExecutorService
不会给您带来很多好处。就我从你的问题中所看到的,如果你在
stop()
时没有在线程中保留任何锁,那么使用
stop()
似乎是一个可行的选择

编辑:

根据(第47页),调用
ReceiveNextEvent
时,可以指定
EventTimeout

ReceiveNextEvent运行低级别事件循环,将事件放置为 发生在事件队列中。当事件发生时,函数返回 当超过指定的超时时,或发生指定的超时

OSStatus ReceiveNextEvent(
UInt32 inNumTypes,
const EventTypeSpec *inList,
EventTimeout inTimeout,
Boolean inPullEvent,
EventRef *outEvent);

因此,如果我理解正确,在调用本机代码时设置超时可以帮到你。

你认为try-catch和end-normal会起作用吗?@Madhu如果异常卡在本机代码中,你不能抛出异常(即try/catch任何东西)——这就是问题所在。什么本机调用被阻塞了?你能人为地满足等待吗?“我仅有的工作代码是使用System.exit”不使用System.exit的主要原因是什么?@MartinJames这是对Mac Carbon framework函数的调用,该函数名为
ReceiveNextEvent
,它一直在调度操作系统事件。System.exit的问题是-首先,我需要释放一些本机资源,而这只有在我移出本机代码时才会发生。对不起,我的意思是
Thread.stop
。一个错误。线程没有出现,也没有抛出ThreadDeath异常