最近学习netty时了解到Future异步调用,学习下。
FutureTask实现了两个接口,Runnable和Future,所以它既可以作为Runnable被线程执行,又可以作为Future得到Callable的返回值
import java.util.concurrent.Callable;
/**
* JDK中的future模式:call()方法会构造我们需要的真实数据并返回。
*/
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);
Thread.sleep(1000);
}
return sb.toString();
}
}
/**
* Created by ddyb on 2016/5/30.
*/
public class FutureMain {
public static void main(String[] args) throws ExecutionException, InterruptedException {
//构造 FutureTask
FutureTask<String> future = new FutureTask<>(new RealData("a"));
//创建一个可重用固定线程数的线程池,以共享的无界队列方式来运行这些线程。
ExecutorService executor = Executors.newFixedThreadPool(1);
// 执行FutureTask
// 在这里开启线程进行RealData的call()执行。
executor.submit(future);
System.out.println("请求完毕...");
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
// 如果此时 call() 方法没有执行成功, 则依然会等待。
// 也可以设置超时时间 future.get(5000, TimeUnit.MILLISECONDS)
System.out.println("数据 = " + future.get() );
}
}