akka入门-Futures

在 Akka 中, 一个 Future 是用来获取某个并发操作的结果的数据结构。 这个操作通常是由 Actor 执行或由 Dispatcher 直接执行的. 这个结果可以是同步(阻塞)或异步(非阻塞)的方式访问。

其中有执行上下文ExecutionContext。为了运行回调和操作, Futures 需要有一个 ExecutionContext, 它与 java.util.concurrent.Executor 很相像. 如果你在作用域内有一个 ActorSystem , 它会它自己派发器用作 ExecutionContext, 你也可以用 ExecutionContext 伴生对象提供的工厂方法 来将 Executors 和 ExecutorServices 进行包裹, 或者创建自己的实例.

1.直接使用

Akka中的一个常见用例是在不需要使用 Actor的情况下并发地执行计算. 如果你发现你只是为了并行地执行一个计算而创建了一堆 Actor, 下面是一种更好(也更快)的方法:

import static akka.dispatch.Futures.future ;
import static java.util.concurrent.TimeUnit.SECONDS;

import java.util.concurrent.Callable;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import scala.concurrent.Await;
import scala.concurrent.Future;
import scala.concurrent.duration.Duration;
import akka.actor.ActorSystem;

/**
 *
 * @author lcq
 *
 */
public class System {
  public static final Logger log = LoggerFactory.getLogger(System.class);

  public static void main(String[] args) throws Exception {
    final ActorSystem actorSystem = ActorSystem.create("actor-system");
    Future<String> f = future(new Callable<String>() {
      public String call() {
        return "Hello" + "World" ;
      }
    }, actorSystem.dispatcher ());
    String result = (String) Await. result(f, Duration.create(1, SECONDS));
    log.info( "result : " + result );

    Thread.sleep(2000);
    log.debug( "Actor System Shutdown Starting..." );
    actorSystem.shutdown();
  }

}
输出结果:

21:02:53.666 [main] INFO  com.center.akka.Futures.System - result : HelloWorld
21:02:55.669 [main] DEBUG com.center.akka.Futures.System - Actor System Shutdown Starting...

2.函数式Future

程序中第二个Future输出第一个Future返回的字符串的长度。

import static akka.dispatch.Futures.future ;
import static java.util.concurrent.TimeUnit.SECONDS;

import java.util.concurrent.Callable;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import scala.concurrent.Await;
import scala.concurrent.ExecutionContext;
import scala.concurrent.Future;
import scala.concurrent.duration.Duration;
import akka.actor.ActorSystem;
import akka.dispatch.Mapper;

/**
 * 函数式 Future
 *
 * @author lcq
 *
 */
public class FutureTest {
  public static final Logger log = LoggerFactory.getLogger(FutureTest.class);

  public static void main(String [] args ) throws Exception {
    final ActorSystem actorSystem = ActorSystem.create("actor-system");
    Future<String > f1 = future( new Callable<String>() {
      public String call() {
        return "Hello" + "World" ;
      }
    }, actorSystem.dispatcher());
    final ExecutionContext ec = actorSystem.dispatcher();

    Future<Integer> f2 = f1.map( new Mapper<String, Integer>() {
      public Integer apply( String s) {
        return s .length();
      }
    }, ec);

    int result = Await.result(f2 , Duration.create(1, SECONDS));
    log.info( "result : " + result );

    Thread.sleep(2000);

    log.debug( "Actor System Shutdown Starting..." );

    actorSystem.shutdown();
  }

}
输出结果:

21:03:15.435 [main] INFO  com.center.akka.Futures.FutureTest - result : 10
21:03:17.438 [main] DEBUG com.center.akka.Futures.FutureTest - Actor System Shutdown Starting...




  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值