Java多线程处理,怎么才能知道多线程执行完毕?

第三方系统提供的接口不支持批量接收数据, 只能一笔一笔的调用,我们有1000多条数据,就得请求1000次这个接口, 效率很是低下! 所以我想利用多线程的方式快速的调用完这1000次接口请求并处理响应(前端调用我这个接口 我立马返回结果了,因为是多线程异步处理,执行完后 前端再查一下结果!)
还有个要求就是 这1000笔执行完成后 调用一个发送短信接口! 然而我通过future.get()来搞(每次接口调用成功返回我都add到List中,最终判断List的size是否是我那1000笔一致,如果一致那么就说明线程执行完毕),结果阻塞了主线程,变成同步了,前端一直得不到响应, 有没有啥好的办法,既让他不阻塞主线程又能知道线程执行完毕!?


回答:

用CountDownLatch:

int requestCount = 1000;

CountDownLatch latch = new CountDownLatch(requestCount);

for (int i = 0; i < requestCount; i++) {

new Thread(() -> {

// 调用第三方接口

// ...

// 操作完成,递减计数器

latch.countDown();

}).start();

}

// 新开一个线程等待所有请求完成后发送短信

new Thread(() -> {

try {

latch.await();

// 所有请求完成,发送短信

// ...

} catch (InterruptedException e) {

e.printStackTrace();

}

}).start();

或者用CompletableFuture.allOf。

CompletableFuture[] futures = new CompletableFuture[requestCount];

for (int i = 0; i < requestCount; i++) {

futures[i] = CompletableFuture.runAsync(() -> {

// 调用第三方接口

// ...

});

}

// 所有请求完成后发送短信

CompletableFuture.allOf(futures).thenRun(() -> {

// 发送短信

// ...

});

你理解的没问题用CompletableFuture.runAsync(Runnable runnable, Executor executor)这个方法。这样可以用你自己的线程池来执行这些异步任务:

ExecutorService executor = Executors.newFixedThreadPool(100); 

CompletableFuture[] futures = new CompletableFuture[requestCount];

for (int i = 0; i < requestCount; i++) {

futures[i] = CompletableFuture.runAsync(() -> {

// 调用第三方接口

// ...

}, executor); // 用自定义线程池

}

// 所有请求完成后发送短信

CompletableFuture.allOf(futures).thenRun(() -> {

// 发送短信

// ...

}).thenRun(() -> executor.shutdown()); // 所有任务完成后关闭线程池

Java CompletableFuture 的官方文档

以上是 Java多线程处理,怎么才能知道多线程执行完毕? 的全部内容, 来源链接: utcz.com/p/945280.html

回到顶部