CountDownLatch、CyclicBarrier、Semaphore、Exchanger是并发工具类,都通过聚集同步器对并发流程进行控制。CountDownLatch和CyclicBarrier均用于等待其他线程完成工作后本线程才继续执行,不同之处在后者可以循环(cyclic)使用,即出现错误可以使用CyclicBarrier.reset()方法重置屏障。Semaphore用于控制对特定资源的访问数量。Exchanger用于线程之间数据交换。
编程模型
1、CountDownLatch:
public static void main() {
static CountDownLatch c = new CountDownLatch(3)
new Thread(new Runnable() {
@Override
public void run() {
//业务逻辑
c.countDown();
}
}).start(); //subthread 1
new Thread(new Runnable() {
@Override
public void run() {
//业务逻辑
c.countDown();
}
}).start(); //subthread 2
c.await();
}
2、CyclicBarrier:
public static void main() {
static CyclicBarrier c = new CyclicBarrier(2)
new Thread(new Runnable(){
@Override
public void run() {
//业务逻辑
try {
c.await();
} catch (Exception e) {
}
}
}).start();
try {
c.await();
} catch (Exception e) {
}
}
3、Semaphore
private static semaphore s = new semaphore(6); // 控制6个线程可以访问资源
public static void mian() {
for (int i = 0; i < THREAD_COUNT; i++) {
threadPool.execute(new Runnable() {
@Override
public void run() {
s.acquire();
//资源访问代码
s.release();
}
});
}
}
4、Exchanger
static Exchanger<MessageData> exchanger = new Exchanger<MessageData>();
public static void main() {
new Thread(new Runnable() {
@Override
public void run() {
MessageData A = new MessageData("A", 1);
try {
exchanger.exchange(A); // 此线程交换走A,获得B
} catch (InterruptedException e) {
}
}
}).start();
new Thread(new Runnable() {
@Override
public void run() {
MessageData B = new MessageData("B", 2); //此线程交换走B,获取A
try {
exchanger.exchange(B);
} catch (InterruptedException e) {
}
}
}).start();
}