Akka working with Future functionally_map方法

看代码,

package com.usoft;

import akka.dispatch.ExecutionContexts;
import akka.dispatch.Futures;
import akka.dispatch.Mapper;
import akka.dispatch.OnComplete;
import akka.dispatch.OnFailure;
import akka.dispatch.OnSuccess;
import scala.concurrent.ExecutionContextExecutorService;
import scala.concurrent.Future;

import java.util.concurrent.Callable;
import java.util.concurrent.Executors;

/**
 * Created by liyanxin on 2015/1/8.
 */
public class FutureDemo {

    public static void main(String args[]) {

        // 执行上下文可以自己指定线程池类型
        // 需要一个ExecutionContext作为其executor
        // Future 需要一个ExecutionContext, 它与java.util.concurrent.Executor 很相像.
        // 如果你在作用域内有一个 ActorSystem , 它可以用system.dispatcher()作 ExecutionContext。
        // 你也可以用ExecutionContext
        // 伴生对象提供的工厂方法来将 Executors 和 ExecutorServices 进行包裹, 或者甚至创建自己的实例.
        ExecutionContextExecutorService ec = ExecutionContexts.
                fromExecutorService(Executors.newCachedThreadPool());

        Future<String> f1 = Futures.future(new Callable<String>() {
            public String call() throws InterruptedException {
                Thread.sleep(5000); //在当前的线程内阻塞5秒
                System.out.println(Thread.currentThread().getName() + " thread end|||f1");
                return "Hello" + "World";
            }
        }, ec);

        /**
         * 通过map方法 f1 -> f2
         * Now we have a second Future,
         * f2, that will eventually contain an Integer. When our original Future, f1, completes, it will also apply our
         * function and complete the second Future with its result. When we finally get the result, it will contain the
         * number 10. Our original Future still contains the string “HelloWorld” and is unaffected by the map.
         */
        Future<Integer> f2 = f1.map(new Mapper<String, Integer>() {
            public Integer apply(String s) {
                System.out.println(Thread.currentThread().getName() + " thread end|||f1->f2");
                return s.length();
            }
        }, ec);

        f2.onComplete(new OnComplete<Integer>() {
            @Override
            public void onComplete(Throwable failure, Integer success) throws Throwable {
                System.out.print(Thread.currentThread().getName() + " thread end|||");
                System.out.println("f2 on complete=" + success);
            }
        }, ec);

        f2.onSuccess(new OnSuccess<Integer>() {
            @Override
            public void onSuccess(Integer result) throws Throwable {
                System.out.print(Thread.currentThread().getName() + " thread end|||");
                System.out.println("返回结果的长度=" + result);
            }
        }, ec);

        f2.onFailure(new OnFailure() {
            @Override
            public void onFailure(Throwable failure) throws Throwable {
                System.out.print(Thread.currentThread().getName() + " thread end|||");
                System.out.println("f2 failure=" + failure.getMessage());
            }
        }, ec);
        System.out.println(Thread.currentThread().getName() + " thread end");
    }
}

运行结果,

main thread end

pool-1-thread-1 thread end|||f1

pool-1-thread-2 thread end|||f1->f2

pool-1-thread-1 thread end|||f2 on complete=10

pool-1-thread-3 thread end|||返回结果的长度=10

============================END============================

时间: 2024-12-13 05:33:37

Akka working with Future functionally_map方法的相关文章

java之Calablel Future

java中的Callable接口是为了增强Runnable接口的功能,但它不是Runnable接口的子接口.其中提供call()方法作为线程执行体,但它有两个地方与Runnable的run()方法不同: 1.该方法需要抛出异常:2.该方法可以有返回值. Callable不能作为Thread的target,其call返回值也不哼直接调用,java中提供Future接口,并由FutureTask类实现该接口和Runnable接口,这样可以用FutureTask类包装Callable接口,并将其作为T

【java并发】Callable与Future的应用

Callable 接口类似于 Runnable,两者都是为那些其实例可能被另一个线程执行的类设计的.但是 Runnable 不会返回结果,并且无法抛出经过检查的异常.而Callable可以返回一个结果,这个返回值可以被Future拿到,也就是说,Future可以拿到异步执行任务的返回值,下面来看一个简单的例子: public class CallableAndFuture { public static void main(String[] args) { ExecutorService thr

Java - 多线程Callable、Executors、Future

http://blog.csdn.net/pipisorry/article/details/44341579 Introduction Callable接口代表一段能够调用并返回结果的代码; Future接口表示异步任务.是还没有完毕的任务给出的未来结果. 所以Callable用于产生结果,Future用于获取结果. Callable接口:Java 5在concurrency包中引入了java.util.concurrent.Callable 接口.它和Runnable接口非常类似,但它能够返

Reset方法将Enumerator移到集合的开头

为了提高性能,可以通过复制功能简历若干个从数据库,并在从数据库中启用持久化,同时在主数据中禁用持久化.当从数据库崩溃时重启后主数据会自动将数据同步过来,所以无需担心数据丢失.而当主数据库崩溃时,需要在从数据库中使用slaveof no one 命令将从数据库提升为主数据继续服务,并将原来的主数据库启动后使用slaveof命令将其设置为新的主数据库的从数据库,即可将新的数据同步过来. 因前段时间给老板做了个在线编辑lua文件的小工具,期间用到了上述几个新的API,感觉挺有意思,所以决定做一个在线编

【Java多线程】Future与FutureTask

一:Future 在使用实现Callable创建线程时,call()方法是有返回值的.那么,我们在编程时用什么来代表这个 线程执行后才能返回的未来结果 呢?那就是 Future类型. 顾名思义,Future--未来值,我们用这个未来值来代替编程中需要用到线程结果的地方,然后在实际运行时,通过 future.get() 方法来获取线程的真正运行结果. Future接口有一个泛型参数,其类型与call()方法的返回值类型要一致,也就是说,Future<V>  只是代表 V类型的未来值 而已,不是真

从Java future 到 Guava ListenableFuture实现异步调用

本文是在学习中的总结,欢迎转载但请注明出处:http://blog.csdn.net/pistolove/article/details/51232004 前言 随着移动互联网的蓬勃发展,手机App层出不穷,其业务也随之变得错综复杂.针对于开发人员来说,可能之前的一个业务只需要调取一次第三方接口以获取数据,而如今随着需求的增加,该业务需调取多个不同的第三方接口.通常,我们处理方法是让代码同步顺序的去调取这些接口.显然,调取接口数量的增加必然会造成响应时间的增加,势必会对系统性能造成一定影响. 为

ExecutorService的submit方法使用

在Java5之后,并发线程这块发生了根本的变化,最重要的莫过于新的启动.调度.管理线程的一大堆API了.在Java5以后,通过Executor来启动线程比用Thread的start()更好.在新特征中,可以很容易控制线程的启动.执行和关闭过程,还可以很容易使用线程池的特性. 一.创建任务 任务就是一个实现了Runnable接口的类. 创建的时候实run方法即可. 二.执行任务 通过java.util.concurrent.ExecutorService接口对象来执行任务,该接口对象通过工具类ja

RubberDuck重写了Duck类fly方法

当一个事件发生之后,用户需要一段时间才能知道结果,那么这段时间究竟应该让用户干什么?这个问题很常见,比如我们的软件需要向服务器提交用户提供的数据,但是考虑到网络问题,可能不会立马得到反馈. 比如耗时任务我们只完成了一半,我们就异常结束了(这里不考虑事务一致性,我们只考虑一定要将任务完成).又比如在清数据的时候,数据库发生断连.这时候我们会发现线程死掉了,任务终止了,我们需要重启整个项目把该定时任务起起来. 笔者在看JDK源码的同时也穿插着看设计模式,之前有涉猎设计模式,但是没有进行总结和提炼,现

新手浅谈Future

Future到底是什么东西?很多人都对这个东西感到特别奇怪(好吧,我承认,那个很多人就只是我自己而已),就我现在的理解,因为本人在并发这方面没有 多少实践经验,所以只好就着一些资料和自己的理解给它下个定义,Future就是保存我们任务的完成信息,比如说,任务中会通过返回某些东西告诉别人它已 经结束了,而Future中就保存了这种信息.利用Futu保存和得到任务的结果的用法如下: Future<String> future = threadPool.submit(new Callable<