当我们在整体代码运行时可以正常执行但是因为代码的串行化而导致了执行效率太低时可以考虑线程的并行执行,但是常规的Runnable代码过于复杂,而JDK1.8的新特性能够通过lambda表达式的方式实现多线程执行,并且支持单个线程执行完时等待其他线程.
demo案例:
public class CompletableFutureTest {
// 任务一
public Integer aMethod(){
try {
Thread.sleep(3000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("a方法运行完毕");
return 10;
}
// 任务二
public int bMethod() {
try {
Thread.sleep(4000);
System.out.println("b方法运行完毕");
} catch (InterruptedException e) {
e.printStackTrace();
}
return 30;
}
// 任务三
public int cMethod() {
try {
Thread.sleep(5000);
System.out.println("c方法运行完毕");
} catch (InterruptedException e) {
e.printStackTrace();
}
return 30;
}
// 单线程
@Test
public void test01()throws Exception{
System.out.println("开始..." + new Date().toLocaleString());
//取值
Integer a = aMethod();
Integer b = bMethod();
Integer c = cMethod();
System.out.println(a + b + c);
System.out.println("结束..." + new Date().toLocaleString());
}
// 多线程
@Test
public void test02()throws Exception{
CompletableFuture<Integer> aFuture = CompletableFuture.supplyAsync(() -> {
return aMethod();
});
CompletableFuture<Integer> bFuture = CompletableFuture.supplyAsync(() -> {
return bMethod();
});
CompletableFuture<Integer> cFuture = CompletableFuture.supplyAsync(() -> {
return cMethod();
});
System.out.println("开始..." + new Date().toLocaleString());
//并行处理
CompletableFuture.allOf(aFuture, bFuture, cFuture).join();
//取值
Integer a = aFuture.get();
Integer b = bFuture.get();
Integer c = cFuture.get();
System.out.println(a + b + c);
System.out.println("结束..." + new Date().toLocaleString());
}
}