Skip to content

Instantly share code, notes, and snippets.

@viktorklang
Created April 19, 2012 17:25
Show Gist options
  • Save viktorklang/2422443 to your computer and use it in GitHub Desktop.
Save viktorklang/2422443 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!
@vcaballero-salle
Copy link

I can't see how the FrameActor should be, can anyone give me a minimal example?

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment