19 Callable和Future使用

  CallableFuture使用

 

Future模式非常适合在处理耗时很长的业务逻辑时进行使用,可以有效的减小系统的响应时间,提高系统的吞吐量。

示例代码:

package edu.sdut.concurrent01;

/**

 * Future模式,异步(开启线程)去执行任务,达到并行的效果

 */

import java.util.concurrent.Callable;

扫描二维码关注公众号,回复: 2574620 查看本文章

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

 

猜你喜欢

转载自blog.csdn.net/txgANG/article/details/80915442