废话不多少说先看一下边着个代码,一看就懂, 在一个main方法里边有一个业务一假设需要1000毫秒完成,还有一个业务二需要800毫秒完成
然后 业务一拿到结果,业务二拿到结果合并,之后把result返回
public static void main(String[] args) throws InterruptedException, ExecutionException {
long start = System.currentTimeMillis();
String v1 = "业务一 完成需要1000毫秒";
Thread.sleep(1000);
String v2 = "业务二 完成需要800毫秒";
Thread.sleep(800);
String result = v1 + v2;
System.out.println(result);//v1结果加v2结果返回
long end = System.currentTimeMillis();
System.out.println("总计完成时间 :"+(end-start));
}
我们测一下时间大约需要1801左右
我们为了提升业务效率,用多线成区处理,业务一开一个线程 业务二开一个线程这样 就提升效率了,但是 我们这里有一个要求就是 必须业务一结果和业务二结果合并才可以 然后把结果返回,这里就需要响应式了
如何做直接上代码
public static void main(String[] args) throws InterruptedException, ExecutionException {
ExecutorService threads = Executors.newFixedThreadPool(10); //建立线程池
long start = System.currentTimeMillis();
Callable<String> queryCall = new Callable<String>() {
@Override
public String call() throws Exception {
String callv1 = "业务一 完成需要1000毫秒";
Thread.sleep(1000);
return callv1;
}
};
Callable<String> queryCall2 = new Callable<String>() {
@Override
public String call() throws Exception {
String callv2 = "业务二 完成需要800毫秒";
Thread.sleep(800);
return callv2;
}
};
FutureTask<String> futureTaskCall = new FutureTask<>(queryCall);
FutureTask<String> futureTaskCall2 = new FutureTask<>(queryCall2);
//new Thread(futureTaskCall).start();
// new Thread(futureTaskCall2).start();
//从线程池抽线程
threads.submit(futureTaskCall);
threads.submit(futureTaskCall2);
//FutureTask的get()方法是阻塞式它在这里阻塞等待这个线程执行完并且拿到返回值之后在取消阻塞状态
String v1 = futureTaskCall.get();//获取值任务一的值
String v2 = futureTaskCall2.get();//获取值任务二的值
String result = v1 + v2;
System.out.println(result);//v1结果加v2结果返回
long end = System.currentTimeMillis();
System.out.println("总计完成时间 :"+(end-start));
}
看了马总共用时 1002毫秒是不是快了不少吧! 代码写的很清楚 一定能看懂
这种写法叫接口聚合, 线程1 消耗 5秒 线程2 消耗 4秒 线程3 消耗3秒那么总时间一定式 小于6+4+3的