Future模式

Posted 起个po名真费劲

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Future模式相关的知识,希望对你有一定的参考价值。

Future模式核心思想是异步调用。我们可以先拿到调用的凭证,让方法先返回,让他在后台慢慢的处理这个请求。通过这个可以实现异步操作。

 

JDK经准备好了一套完美的实现方式。我们用于执行的异步线程需要继承Callable接口,相当于Runnable,Callable接口中有一个方法call(),相当于run(),在里面写自己的业务。把这个线程放在futureTask中,这个相当于凭证。把futureTask交给线程池来进行异步处理,我们可以通过futureTask中的get()方法返回结果,结果没有返回会阻塞。

具体实现:

package jdkFuture;

import java.util.concurrent.Callable;

public class ReaLData implements Callable<String>{
    private String para;
    public ReaLData(String para){
        this.para = para;
    }
    @Override
    public String call() throws Exception {
        StringBuffer sb = new StringBuffer();
        for(int i = 0;i < 10;i ++){
            sb.append(para);
            try{
                Thread.sleep(100);
            }catch(InterruptedException e){
                e.printStackTrace();
            }
        }
        return sb.toString();
    }
    
}
package jdkFuture;

import java.util.concurrent.ExecutionException;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.FutureTask;

public class FutureMain {
    public static void main(String[] args) {
        FutureTask<String> future = new FutureTask<String>(new ReaLData("a"));
        ExecutorService executor = Executors.newFixedThreadPool(1);
        executor.submit(future);
        System.out.println("请求完毕");
        while(true){
            try {
                System.out.println("数据= " + future.get());
            } catch (InterruptedException e) {
                e.printStackTrace();
            } catch (ExecutionException e) {
                e.printStackTrace();
            }
        }
    }
}

 

以上是关于Future模式的主要内容,如果未能解决你的问题,请参考以下文章

多线程手写Future模式

多线程设计模式——Read-Write Lock模式和Future模式分析

Future模式理解及FutureTask应用场景

多线程之Future模式

Java深入学习:Future模式

Future 异步回调 大起底之 Java Future 与 Guava Future