【问题标题】:Graceful Shutdown of Thread executing native code优雅关闭执行本机代码的线程
【发布时间】:2013-03-22 10:11:27
【问题描述】:

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

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

如果我中断线程,那么线程仍然不出来(显然)。如果我将线程设置为daemon。它仍然不会让 JVM 关闭。我唯一的工作代码是使用System.exit,显然我不打算使用它。还有其他出路吗?

【问题讨论】:

  • 你认为 try catch 和 end normal 会起作用吗?
  • @Madhu 如果异常卡在本机代码中,您将无法抛出异常(即尝试/捕获任何内容)——这就是问题所在。
  • 什么本地调用被阻塞了?你能人为地满足等待吗?
  • '我唯一的工作代码是使用 System.exit' 不使用 System.exit 的最重要原因是什么?
  • @MartinJames 它调用了名为ReceiveNextEvent 的Mac Carbon 框架函数,它不断调度操作系统事件。 System.exit 的问题是——首先我需要释放一些本机资源,而且只有在我移出本机代码时才会发生这种情况。

标签: java multithreading native macos-carbon


【解决方案1】:

错误在于没有返回的本机代码,真的。据我所知,通过更高级别的 java 执行此操作的唯一方法是 stop() 线程 - several reasons 已弃用。

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

编辑:

根据Apple's developer guide(第47页),您可以在调用ReceiveNextEvent时指定EventTimeout

ReceiveNextEvent 运行低级事件循环,将事件按原样放置 发生在事件队列中。该函数在您发生事件时返回 指定发生,或超过指定的超时时间

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

所以,如果我理解正确,在调用本机代码时设置超时将为您解决问题。

【讨论】:

  • 对不起,我的意思是Thread.stop。一个错误。线程出不来,没有抛出ThreadDeath异常
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-09-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-09-21
相关资源
最近更新 更多