future异步任务处理:
1.构造futureTask,并且传入真正进行业务处理的类,该类一定实现了Callable接口
FutureTask<String> future = new FutureTask<>(new UseFuture(queryStr));
FutureTask<String> future2 = new FutureTask<>(new UseFuture(queryStr2));
2.任务类实现Callable接口重写call()
public class UseFuture implements Callable<String> {
String para;
public UseFuture(String para) {
this.para = para;
}
@Override
public String call() throws Exception {
Thread.sleep(3000);
String result = this.para + ",处理完成";
return result;
}
}
3.线程池创建要执行异步的线程数。
ExecutorService pool = Executors.newFixedThreadPool(2);
4.这里提交任务future,则开启线程执行RealDate的call()方法执行。
//pool.execute()和pool.submit()区别:1.submit可以传入实现callable接口的实例对象。2.submit有返回值。
Future f=pool.submit(future);
5.//调用获取数据的方法,如果call()方法没有处理完成,则依然会等待
System.out.println("数据:" + future.get());
System.out.println("数据:" + future2.get());
关闭线程池
pool.shutdown();
实例代码如下:
package cm.concurrent;
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> {
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 static void main(String[] args) throws Exception {
String queryStr = "query";
String queryStr2 = "query2";
// 构造futureTask,并且传入真正进行业务处理的类,该类一定实现了Callable接口
FutureTask<String> future = new FutureTask<>(new UseFuture(queryStr));
FutureTask<String> future2 = new FutureTask<>(new UseFuture(queryStr2));
// 创建只有一个线程的线程池
ExecutorService pool = Executors.newFixedThreadPool(2);
// 这里提交任务future,则开启线程执行RealDate的call()方法执行。
//pool.execute()和pool.submit()区别:1.submit可以传入实现callable接口的实例对象。2.submit有返回值。
Future f=pool.submit(future);
Future f2=pool.submit(future2);
System.out.println("请求完毕!");
/*while(true){
if(f.get()==null){//f返回值为null表示处理任务完成。
System.out.println("当前任务处理完毕!");
break;
}
}*/
//调用获取数据的方法,如果call()方法没有处理完成,则依然会等待
System.out.println("数据:" + future.get());
System.out.println("数据:" + future2.get());
pool.shutdown();
}
}