【原创】大叔经验分享(73)scala akka actor

时间:2021-10-18 02:19:42
import java.util.concurrent.{ExecutorService, Executors, TimeUnit}
import akka.actor.{Actor, ActorSystem, Props}
import akka.util.Timeout
import scala.concurrent.{Await, ExecutionContext}
import scala.concurrent.duration.Duration

 

Runnable

无返回值

  class TestActor extends Actor {
    def receive = {
      case arg => {
        println("got : " + arg)
        Thread.sleep(1000)
      }
    }
  }

同步调用

val system = ActorSystem("ActorSystem")
val actor = system.actorOf(Props(new TestActor), "TestActor")
actor ! "whatever"

Callable

有返回值

  class TestActor extends Actor {
    def receive = {
      case arg => {
        println("got : " + arg)
        Thread.sleep(1000)
        sender ! "hello : " + arg
      }
    }
  }

异步调用

    val system = ActorSystem("ActorSystem")
val actor = system.actorOf(Props(new TestActor), "TestActor")
    implicit val timeout = Timeout(10000, TimeUnit.SECONDS)
    import akka.pattern._

//1 val feature
= actor ? "whatever" while (!feature.isCompleted) Thread.sleep(1000) println(feature.isCompleted) if (feature.isCompleted) {println(feature.value.get.isSuccess + ", " + feature.value.get.get);}
//2 println(Await.result(feature, Duration.create(
1, TimeUnit.SECONDS)))

更多

并发控制

  val ec = ExecutionContext.fromExecutorService(Executors.newFixedThreadPool(100))
  val system = ActorSystem("ActorSystem", None, None, Option(ec))

定时

    val system = ActorSystem("ActorSystem")
    system.scheduler.schedule(Duration.create(1, TimeUnit.SECONDS), Duration.create(1, TimeUnit.SECONDS))({
      println("trigger : " + System.currentTimeMillis)
    })(ec)

 

注意Actor相当于java中的单实例单线程,可以通过多个Actor来控制并发