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