一、CountDownlatch(多线程通信计数器实现多个线程的协同工作)
java
import java.util.concurrent.CountDownLatch;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
public class CountDownLatchTest {
public static void main(String[] args) {
ExecutorService executor = Executors.newFixedThreadPool(3);
CountDownLatch count = new CountDownLatch(3);
executor.execute(() -> {
try {
findBy三方();
} catch (InterruptedException e) {
throw new RuntimeException(e);
}
count.countDown();
});
executor.execute(() -> {
try {
findByMySQL();
} catch (InterruptedException e) {
throw new RuntimeException(e);
}
count.countDown();
});
executor.execute(() -> {
try {
findBy服务();
} catch (InterruptedException e) {
throw new RuntimeException(e);
}
count.countDown();
});
try {
count.await();
System.out.println("汇总结束");
} catch (InterruptedException e) {
throw new RuntimeException(e);
}
}
public static void findBy三方() throws InterruptedException {
Thread.sleep(700);
}
public static void findByMySQL() throws InterruptedException {
Thread.sleep(200);
}
public static void findBy服务() throws InterruptedException {
Thread.sleep(300);
}
}
二、CyclicBarrier(与CountDownlatch不同的是可以重复使用)
java
import java.util.concurrent.*;
public class CyclicBarrierTest {
public static void main(String[] args) {
ExecutorService executor = Executors.newFixedThreadPool(3);
CyclicBarrier cyclicBarrier = new CyclicBarrier(3, () -> {
System.out.println("汇总完毕");
});
executor.execute(() -> {
try {
findBy三方();
cyclicBarrier.await();
} catch (InterruptedException | BrokenBarrierException e) {
throw new RuntimeException(e);
}
});
executor.execute(() -> {
try {
findByMySQL();
cyclicBarrier.await();
} catch (InterruptedException | BrokenBarrierException e) {
throw new RuntimeException(e);
}
});
executor.execute(() -> {
try {
findBy服务();
cyclicBarrier.await();
} catch (InterruptedException | BrokenBarrierException e) {
throw new RuntimeException(e);
}
});
cyclicBarrier.reset();
}
public static void findBy三方() throws InterruptedException {
Thread.sleep(700);
System.out.println("查询完三方");
}
public static void findByMySQL() throws InterruptedException {
Thread.sleep(200);
System.out.println("查询完MySQL");
}
public static void findBy服务() throws InterruptedException {
Thread.sleep(300);
System.out.println("查询完b服务");
}
}
三、Semaphore(信号量,控制线程执行的数量)
java
import java.util.concurrent.Semaphore;
import java.util.concurrent.TimeUnit;
public class SemaphoreTest {
public static void main(String[] args) {
Semaphore sem = new Semaphore(2);
for (int i = 0; i < 3; i++) {
new Thread(() -> {
try {
sem.acquire();
System.out.println(Thread.currentThread() + "I get it");
TimeUnit.SECONDS.sleep(3);
System.out.println(Thread.currentThread() + "I release it");
} catch (InterruptedException e) {
throw new RuntimeException(e);
} finally {
sem.release();
}
}).start();
}
}
}