CompletableFuture 异常处理completeExceptionally可以把异常抛到主线程
/**
* User: laizhenwei
* Date: 2018-01-30 Time: 22:26
* Description:
*/
@RunWith(SpringRunner.class)
//@SpringBootTest
public class CompletableFutureTests {
@Test
public void testMethod() {
String[] orders = {"1", "2", "3", "4", "5", "6"};
List<CompletableFuture<Boolean>> futures = new ArrayList<>();
Arrays.stream(orders).forEach(id -> {
try{
futures.add(submitAsync(id));
}catch (Exception ex){
System.out.println(ex);
}
});
futures.stream().forEach(f-> {
try {
System.out.println(f.get());
} catch (Exception e) {
e.printStackTrace();
}
});
}
private static Boolean submit(String order) {
try {
TimeUnit.SECONDS.sleep(1);
} catch (InterruptedException e) {
e.printStackTrace();
}
throw new RuntimeException("抛一个异常" + order);
}
private static CompletableFuture<Boolean> submitAsync(String order) {
CompletableFuture<Boolean> future = new CompletableFuture<>();
new Thread(() -> {
try {
Boolean result = submit(order);
future.complete(result);
} catch (Exception ex) {
future.completeExceptionally(ex);
}
}).start();
return future;
}
}

使用 CompletableFuture.supplyAsync 简化代码 加入线程池,exceptionally处理异常
/**
* User: laizhenwei
* Date: 2018-01-30 Time: 22:26
* Description:
*/
@RunWith(SpringRunner.class)
//@SpringBootTest
public class CompletableFutureTests {
ExecutorService executor = Executors.newFixedThreadPool(3);
@Test
public void testMethod() {
String[] orders = {"1", "2", "3", "4", "5", "6"};
Arrays.stream(orders).forEach(id -> CompletableFuture.supplyAsync(() -> submit(id), executor).exceptionally(e -> {
System.out.println(e);
return false;
}));
executor.shutdown();
while (!executor.isTerminated()) {
try {
TimeUnit.MILLISECONDS.sleep(500);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
private static Boolean submit(String order) {
try {
TimeUnit.SECONDS.sleep(1);
} catch (InterruptedException e) {
e.printStackTrace();
}
throw new RuntimeException("抛一个异常" + order);
}
}

来源:http://www.cnblogs.com/sweetchildomine/p/8387724.html