【问题标题】:Pin/Run Akka Actor to Main Thread将 Akka Actor 固定/运行到主线程
【发布时间】:2013-10-05 13:16:06
【问题描述】:

我目前正在研究在使用 LWJGL 的应用程序中使用 Scala 和 Akka。众所周知,您不能真正在应用程序的主线程之外发出 OpenGL 调用。如果我想使用任何参与者进行渲染(例如,一个单一的主要参与者,它会耗尽渲染命令队列,或者有多个参与者可能随时发出任意 OpenGL 命令),这会带来一个问题,因为我还没有看到一种在特定线程上运行任何actor的方法。通过将特定参与者固定到线程,或通过指示参与者在某个时间点在特定线程上运行。 (a la Objective-C 的 performSelectorOnMainThread)

有没有办法将“渲染”actor 固定到主线程,或者让任何actor 在未来某个时候在主线程上运行,届时它将能够发出 OpenGL 调用? (甚至是其他一些解决方案,我对想法持开放态度)

【问题讨论】:

  • Akka 可能不是一个很好的用例。虽然它确实提供了您所要求的内容,但它仅用于单元测试。 doc.akka.io/docs/akka/2.2.1/scala/…
  • 您可以在主线程中创建一个消息循环并简单地使用来自参与者的消息。它可能位于某种Runnable 的队列中。

标签: multithreading scala opengl akka


【解决方案1】:

要固定 Akka Actor 的执行线程,您可以使用自定义执行器服务配置:

  akka {
    ...
    actor {
      ...
      my-dispatcher {
        executor = "com.github.plokhotnyuk.actors.CustomExecutorServiceConfigurator"
      }
    }
  }


class CustomExecutorServiceConfigurator(config: Config, prerequisites: DispatcherPrerequisites) extends ExecutorServiceConfigurator(config, prerequisites) {
  def createExecutorServiceFactory(id: String, threadFactory: ThreadFactory): ExecutorServiceFactory = new ExecutorServiceFactory {
    def createExecutorService: ExecutorService = myExecutorService()
  }
}

完整的例子是here

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-09-09
    • 1970-01-01
    • 1970-01-01
    • 2023-03-11
    • 1970-01-01
    • 2023-04-02
    • 2023-03-17
    • 2014-01-07
    相关资源
    最近更新 更多