【Java并发编程】FutureTask 阻塞等待异步结果

什么是FutureTask

FutureTask类实现了RunnableFuture接口,RunnableFuture继承了Runnable接口和Future接口,而FutureTask实现了RunnableFuture接口。所以FutureTask 既可以作为Runnable被线程执行,又可以作为Future得到Callable的返回值。

怎么用FutureTask

由介绍可知,FutureTask 既可以作为Runnable被线程执行,又可以作为Future得到Callable的返回值。两者兼得,所以我们使用FutureTask配合线程池,可以完多任务的异步的任务。如果取得call()方法返回的结果,则FutureTask应当使用get()方法,这个方法会产生阻塞,会一直等到任务执行完毕才返回。
代码如下:

import java.util.concurrent.Callable;

public class RealData implements Callable<String> {
    @Override
    public String call() throws Exception {
        Thread.sleep( 2000 );
        return "haya";
    }
}
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.FutureTask;

public class FutureMain {
    public static void main(String[] args) throws Exception{
        FutureTask<String> future = new FutureTask<>( new RealData(  ) );
        FutureTask<String> future1 = new FutureTask<>( new RealData(  ) );
        ExecutorService executor = Executors.newFixedThreadPool( 2 );
        executor.submit( future );
        executor.submit( future1);
        System.out.println( future.get() );
        System.out.println( future1.get() );
        System.out.println( "执行完毕" );
        System.out.println("...........");
    }
}

你可能感兴趣的:(Java)