我先用中文描述一下思路(假设有3个线程):
设置一个共享变量,记录成功个数
successCounter,对于单个线程来说,如果成功了就对这个变量++;否则,已失败,不必再等。
等待
等3个线程都执行完
判断结果
如果successCounter等于3,整体成功。否则,失败。
代码:
import java.util.concurrent.CountDownLatch;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.atomic.AtomicInteger;
public class App {
public static void main(String[] args) {
// 线程个数
final int SIZE = 3;
// 交给单个线程处理,成功了就加1
final AtomicInteger successCounter = new AtomicInteger();
final CountDownLatch latch = new CountDownLatch(SIZE);
final ExecutorService pool = Executors.newCachedThreadPool();
for (int i = 0; i < SIZE; i++) {
pool.submit(new Runnable() {
@Override
public void run() {
final boolean success = Math.random() > 0.1;
System.out.println(
Thread.currentThread().getName() +
", success = " + success);
if (success) {
// 单个成功
successCounter.getAndIncrement();
latch.countDown();
} else {
// 单个失败,亦整体失败
while (latch.getCount() > 0) {
latch.countDown();
}
}
}
});
}
pool.shutdown();
try {
latch.await();
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("成功的线程个数: " + successCounter);
if (successCounter.get() == SIZE) {
System.out.println("整体成功");
} else {
System.out.println("整体失败");
}
}
}
成功的case:
pool-1-thread-1, success = true
pool-1-thread-3, success = true
pool-1-thread-2, success = true
成功的线程个数: 3
整体成功
失败的case:
pool-1-thread-1, success = true
pool-1-thread-2, success = false
pool-1-thread-3, success = true
成功的线程个数: 2
整体失败