在我的应用程序中,我有一个ExecutorService
固定大小的1
.
现在线程调用一些本机代码。在本机方法内部,它被阻塞并等待需要调度的操作系统事件。问题在于ExecutorService
.
如果我中断线程,那么线程仍然没有出来(显然)。如果我将线程设置为daemon
. 它仍然不会让 JVM 关闭。我唯一的工作代码是使用System.exit
它,显然我不打算使用它。还有其他出路吗?
在我的应用程序中,我有一个ExecutorService
固定大小的1
.
现在线程调用一些本机代码。在本机方法内部,它被阻塞并等待需要调度的操作系统事件。问题在于ExecutorService
.
如果我中断线程,那么线程仍然没有出来(显然)。如果我将线程设置为daemon
. 它仍然不会让 JVM 关闭。我唯一的工作代码是使用System.exit
它,显然我不打算使用它。还有其他出路吗?
错误在于没有返回的本机代码,真的。据我所知,通过更高级别的 java 进行此操作的唯一方法是使用线程 - 由于几个原因stop()
,该线程已被弃用。
为此,您需要重新设计以使用老式的Thread
而不是ExecutorService
. 您也可以这样做,因为大小固定为 1,因此ExecutorService
不会给您带来很多好处。stop()
据我从您的问题中看到的,如果您在线程中不保留任何锁,这似乎是一个可行的选择stop()
。
编辑:
根据Apple 的开发人员指南(第 47 页),您可以EventTimeout
在调用时指定ReceiveNextEvent
:
ReceiveNextEvent 运行低级事件循环,将发生的事件放入事件队列中。当您指定的事件发生或超过指定的超时时,该函数返回。
OSStatus ReceiveNextEvent( UInt32 inNumTypes, const EventTypeSpec *inList, EventTimeout inTimeout, Boolean inPullEvent, EventRef *outEvent);
因此,如果我理解正确,在调用本机代码时设置超时将为您解决问题。