Callable和Future使用
Future模式非常适合在处理耗时很长的业务逻辑时进行使用,可以有效的减小系统的响应时间,提高系统的吞吐量。
示例代码:
package edu.sdut.concurrent01;
/** * Future模式,异步(开启线程)去执行任务,达到并行的效果 */ import java.util.concurrent.Callable; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import java.util.concurrent.Future; import java.util.concurrent.FutureTask;
public class UseFuture implements Callable<String>{ private String para; public UseFuture(String para){ this.para = para; }
@Override public String call() throws Exception { Thread.sleep(5000); String result = this.para + ""; return result; }
public static void main(String[] args) throws Exception { String queryStr = "query"; //构造FutureTask,并且传入需要真正进行业务逻辑处理的类,该类一定实现了Callable接口的类 FutureTask<String> future = new FutureTask<String>(new UseFuture(queryStr)); FutureTask<String> future2 = new FutureTask<String>(new UseFuture(queryStr)); ExecutorService executor = Executors.newFixedThreadPool(2); /** * * submit和execute的区别: * 1 、 submit可以传入实现Callable接口的实例对象, * 2 、 submit对象有返回值 */ // 提交future任务,则开启线程执行RealData的call()方法执行 Future f1 = executor.submit(future); Future f2 = executor.submit(future2); System.out.println("请求完毕"); //System.out.println(f1.get()); /** * 如果f.get()返回的null,说明当前任务执行完毕 */ while(true) { if(f1.get()==null) { System.out.println("当前任务执行完毕"); break; } } try { System.out.println("这里可以额外的加数据操作"); Thread.sleep(1000); } catch (Exception e) { e.printStackTrace(); } /** * future.get()是异步的去获取执行结果, * 注意:future的类是FutureTask,f1的类是Future,不是一回事 */ System.out.println("" + future.get()); System.out.println("" + future2.get()); executor.shutdown(); }
} |
代码结果: 请求完毕 当前任务执行完毕 这里可以额外的加数据操作 query query |