Skip to content

Instantly share code, notes, and snippets.

@erwink
Forked from viktorklang/swingactors.scala
Created June 16, 2012 14:58
Show Gist options
  • Star 2 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save erwink/2941554 to your computer and use it in GitHub Desktop.
Save erwink/2941554 to your computer and use it in GitHub Desktop.
Swing Actors using Akka
// ©2012 Viktor Klang
package akka.klang
import akka.dispatch.{ DispatcherPrerequisites, ExecutorServiceFactory, ExecutorServiceConfigurator }
import com.typesafe.config.Config
import java.util.concurrent.{ ExecutorService, AbstractExecutorService, ThreadFactory, TimeUnit }
import java.util.Collections
import javax.swing.SwingUtilities
// First we wrap invokeLater as an ExecutorService
object SwingExecutorService extends AbstractExecutorService {
def execute(command: Runnable) = SwingUtilities.invokeLater(command)
def shutdown(): Unit = ()
def shutdownNow() = Collections.emptyList[Runnable]
def isShutdown = false
def isTerminated = false
def awaitTermination(l: Long, timeUnit: TimeUnit) = true
}
// Then we create an ExecutorServiceConfigurator so that Akka can use our SwingExecutorService for the dispatchers
class SwingEventThreadExecutorServiceConfigurator(config: Config, prerequisites: DispatcherPrerequisites) extends ExecutorServiceConfigurator(config, prerequisites) {
private val f = new ExecutorServiceFactory { def createExecutorService: ExecutorService = SwingExecutorService }
def createExecutorServiceFactory(id: String, threadFactory: ThreadFactory): ExecutorServiceFactory = f
}
// Then we simply need to create a dispatcher configuration in our application.conf
swing-dispatcher {
type = "Dispatcher"
executor = "akka.klang.SwingEventThreadExecutorServiceConfigurator"
throughput = 1
}
// After that we just create the GUI Actors with a Props with the correct dispatcher set:
val frameActor = context.actorOf(Props[FrameActor].withDispatcher("swing-dispatcher"), "frame-actor")
// Done! Now all messages processed by "frameActor" will be executed by the Swing Event Dispatch Thread, enjoy!
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment