You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

82 lines
2.4 KiB

4 years ago
4 years ago
4 years ago
4 years ago
  1. package nova.monadic_sfx.executors
  2. import java.util.Collections
  3. import java.util.concurrent.AbstractExecutorService
  4. import java.util.concurrent.Executor
  5. import java.util.concurrent.ExecutorService
  6. import java.util.concurrent.ThreadFactory
  7. import java.util.concurrent.TimeUnit
  8. import javax.swing.SwingUtilities
  9. import scala.concurrent.ExecutionContext
  10. import akka.dispatch.DispatcherPrerequisites
  11. import akka.dispatch.ExecutorServiceConfigurator
  12. import akka.dispatch.ExecutorServiceFactory
  13. import com.typesafe.config.Config
  14. import javafx.application.Platform
  15. import monix.execution.Scheduler
  16. // First we wrap invokeLater/runLater as an ExecutorService
  17. trait GUIExecutorService extends AbstractExecutorService {
  18. def execute(command: Runnable): Unit
  19. def shutdown(): Unit = ()
  20. def shutdownNow() = Collections.emptyList[Runnable]
  21. def isShutdown = false
  22. def isTerminated = false
  23. def awaitTermination(l: Long, timeUnit: TimeUnit) = true
  24. }
  25. object JavaFXExecutorService extends GUIExecutorService {
  26. override def execute(command: Runnable) = Platform.runLater(command)
  27. }
  28. object SwingExecutorService extends GUIExecutorService {
  29. override def execute(command: Runnable) = SwingUtilities.invokeLater(command)
  30. }
  31. class JavaFXEventThreadExecutorServiceConfigurator(
  32. config: Config,
  33. prerequisites: DispatcherPrerequisites
  34. ) extends ExecutorServiceConfigurator(config, prerequisites) {
  35. private val f = new ExecutorServiceFactory {
  36. def createExecutorService: ExecutorService = JavaFXExecutorService
  37. }
  38. def createExecutorServiceFactory(
  39. id: String,
  40. threadFactory: ThreadFactory
  41. ): ExecutorServiceFactory = f
  42. }
  43. // Then we create an ExecutorServiceConfigurator so that Akka can use our SwingExecutorService for the dispatchers
  44. class SwingEventThreadExecutorServiceConfigurator(
  45. config: Config,
  46. prerequisites: DispatcherPrerequisites
  47. ) extends ExecutorServiceConfigurator(config, prerequisites) {
  48. private val f = new ExecutorServiceFactory {
  49. def createExecutorService: ExecutorService = SwingExecutorService
  50. }
  51. def createExecutorServiceFactory(
  52. id: String,
  53. threadFactory: ThreadFactory
  54. ): ExecutorServiceFactory = f
  55. }
  56. object JFXExecutionContexts {
  57. val javaFxExecutionContext: ExecutionContext =
  58. ExecutionContext.fromExecutor(new Executor {
  59. def execute(command: Runnable): Unit = {
  60. Platform.runLater(command)
  61. }
  62. })
  63. val fxScheduler =
  64. Scheduler(javaFxExecutionContext)
  65. }