java 提供了很多控制线程到达某一状态导致之前阻塞线程运行的函数,这些在控制任务执行提供了很大的便利,比如在zookper 使用Semaphore实现分布式锁
1、CountDownLatch
countDownLatch 提供 await(),CountDownLatch()来控制,前面我很多例子,使用这个来模拟多线程运行的,所以这里不过多介绍
2、CyclicBarrier
CyclicBarrier 和 CountDownLatch差不多,都市提供一个计数器屏障,当所有线程都到达屏障时,一起执行
public class CyCliBarrierTest implements Runnable{
private static final CyclicBarrier barrier = new CyclicBarrier(10, new Runnable() {
@Override
public void run() {
System.out.println("所有线程到达barrier数量执行...");
}
});
private CyclicBarrier barrier1;
public CyCliBarrierTest(CyclicBarrier barrier1) {
this.barrier1 = barrier1;
}
public static void main(String[] args) {
for(int i = 0; i< 10; i++){
new Thread(new CyCliBarrierTest(barrier)).start();
}
}
@Override
public void run() {
try {
System.out.println(Thread.currentThread().getName()+"wait...");
barrier.await();
} catch (InterruptedException e) {
e.printStackTrace();
} catch (BrokenBarrierException e) {
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName()+"start...");
}
}
3、Semaphore
Semaphore 是一个信号类,当线程运行通过时,执行任务
public class SemaphoreTest {
private static final int Max = 2;
private static final Semaphore phore = new Semaphore(Max);
private static final ExecutorService executor =
Executors.newFixedThreadPool(5);
public static void main(String[] args) {
for(int i=0;i<5;i++){
Thread thread = new Thread(new Runnable() {
@Override
public void run() {
try {
phore.acquire(); //最大运行两个任务获取信号
System.out.println("执行任务...");
Thread.sleep(2000);
phore.release();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
});
executor.submit(thread);
}
executor.shutdown();
}
}
Semaphore 提供了一个tryAcquire()来运行获取到信号的运行,没有获取到执行下面逻辑,有点类似tryLock(),
我们对山面改造下
for(int i=0;i<5;i++){
Thread thread = new Thread(new Runnable() {
@Override
public void run() {
try {
if(phore.tryAcquire()){
System.out.println("执行任务...");
Thread.sleep(2000);
phore.release();
}else{
System.out.println("没有获取到执行权限...");
}
} catch (InterruptedException e) {
e.printStackTrace();
}
}
});
executor.submit(thread);
}
executor.shutdown();
结果
执行任务...
执行任务...
没有获取到执行权限...
没有获取到执行权限...
没有获取到执行权限...
本文详细介绍了Java中三种重要的并发控制工具:CountDownLatch、CyclicBarrier和Semaphore。通过实例演示了如何利用这些工具来同步多线程操作,特别强调了它们在控制线程到达特定状态时的作用。
640

被折叠的 条评论
为什么被折叠?



