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异常