类似于我们发送Ajax请求时,页面是异步地进行后台处理,用户无须一直等待请求的结果,可以进行其他的操作,等到结果返回后,用户再去拿数据。
package 并发;
/**
* jdk中的Future模式
*/
import java.util.concurrent.Callable;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Future;
import java.util.concurrent.FutureTask;
class UseFuture implements Callable<String>{
private String para;
public UseFuture(String para){
this.para = para;
}
//这里是真实的业务逻辑,他的执行可能很慢
@Override
public String call() throws Exception
{
//模拟耗时
Thread.sleep(3000);
String result = this.para + "完成了";
return result;
}
}
public class P06FutureCallable
{
public static void main(String[] args) throws InterruptedException, ExecutionException
{
String queryStr = "search";
//构造FutureTask,并且传入需要真正进行业务逻辑处理的类,这个类一定实现了Callable接口
//其call方法中包含了真正进行业务逻辑
FutureTask<String> future = new FutureTask<>(new UseFuture(queryStr));
ExecutorService executor = Executors.newFixedThreadPool(1);
//提交任务future,则开始执行真实的call方法
Future<?> f = executor.submit(future);
try
{ //做额外的操作,主程序中执行其他业务逻辑
System.out.println("主线程执行其他业务逻辑");
Thread.sleep(1000);
}
catch (InterruptedException e)
{
// TODO Auto-generated catch block
e.printStackTrace();
}
//调用获取数据的方法,如果call()方法没有执行完成,则依然会进行等待
System.out.println("数据: "+ future.get());
executor.shutdown();
}
}