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();
结果
执行任务...
执行任务...
没有获取到执行权限...
没有获取到执行权限...
没有获取到执行权限...