在 Akka 中, 一个 Future 是用来获取某个并发操作的结果的数据结构。 这个操作通常是由 Actor 执行或由 Dispatcher 直接执行的. 这个结果可以是同步(阻塞)或异步(非阻塞)的方式访问。
其中有执行上下文ExecutionContext。为了运行回调和操作, Futures 需要有一个 ExecutionContext, 它与 java.util.concurrent.Executor 很相像. 如果你在作用域内有一个 ActorSystem , 它会它自己派发器用作 ExecutionContext, 你也可以用 ExecutionContext 伴生对象提供的工厂方法 来将 Executors 和 ExecutorServices 进行包裹, 或者创建自己的实例.
1.直接使用
2.函数式Future
程序中第二个Future输出第一个Future返回的字符串的长度。
其中有执行上下文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...