从演员运行一个线程

时间:2012-06-25 22:10:13

标签: multithreading scala blocking actor

关闭一个自身在Actor中运行Thread的对象的最佳方法是什么。我不确定最佳策略是什么?

大多数主题似乎围绕着将Threads用于所有内容的想法,但我正在阻止IO并且它不是重写第三方代码的选项;)

有什么特别重要的东西需要注意吗?

1 个答案:

答案 0 :(得分:3)

目前还不清楚你究竟是什么意思,所以如果我有错误的结局就道歉。你有一些ActorA,它的状态是一个对象,它是一些第三方API,它会导致一个单独的线程运行(并且可能会向它发出回调?)

class A extends Actor {
  val api = { ... }
  def act() = { ... }
}

您希望关闭您的演员实例A并且您担心api创建的线程会发生什么?

如果您的第三方API提供了一些机制来干净地处理api(例如destroy方法),那么只需调用它即可!或者向actor发送一个显式的kill信号并让它优雅地退出:

  case 'Kill => api.destroy(); self.exit()

如果API没有提供这样的机制,那么你有点卡住(这是一个糟糕的API,我可能会添加)。你可以关闭你的演员,但单独的线程将继续运行。当然,它可能是守护程序线程,因此不会阻止JVM整体正常关闭。否则,优雅退出程序的唯一方法是从某个适当的位置明确地调用sys.exit(0)