在异步执行任务的时候,遇到数据没执行完就结束了
public class Test {
public static void main(String[] args) throws InterruptedException {
CompletableFuture.runAsync(() -> {
printResult();
});
}
private static void printResult() {
for (int i = 0; i < 100; i++) {
System.out.println(i);
}
}
}
网上搜索了发现CompletableFuture.runAsync方法虽然异步地执行给定的任务,不会阻塞主线程,这意味着printResult方法会在一个新的线程中执行,而主线程将继续执行后续的代码,而不会等待printResult方法执行完毕。
为了确保主线程等待printResult方法执行完毕,得用join方法来阻塞主线程,直到异步任务完成。
以下是修改后的代码
1,使用join方法
public class Test {
public static void main(String[] args) throws InterruptedException {
CompletableFuture<Void> future =CompletableFuture.runAsync(() -> {
printResult();
});
//执行其他线程
//结束
future.join();
}
private static void printResult() {
for (int i = 0; i < 100; i++) {
System.out.println(i);
}
}
}
2,使用计数器CountDownLatch
public class Test {
public static void main(String[] args) throws InterruptedException {
CountDownLatch latch = new CountDownLatch(1);
CompletableFuture<Void> future =CompletableFuture.runAsync(() -> {
try {
printResult();
}catch (Exception e){
e.printStackTrace();
}finally {
latch.countDown();
}
});
//执行其他线程
//结束
latch.await();
}
private static void printResult() {
for (int i = 0; i < 100; i++) {
System.out.println(i);
}
}
}