本文共 7057 字,大约阅读时间需要 23 分钟。
public CountDownLatch(int count) { if (count < 0) throw new IllegalArgumentException("count < 0"); this.sync = new Sync(count); }
public class CountDownLatchTest { static CountDownLatch c = new CountDownLatch(2); public static void main(String[] args) throws InterruptedException { new Thread(new Runnable() { @Override public void run() { System.out.println(1); c.countDown(); System.out.println(2); c.countDown(); } }).start(); c.await(); System.out.println(3); }}
public class CyclicBarrierTest { static CyclicBarrier c = new CyclicBarrier(3); public static void main(String[] args) { new Thread(new Runnable() { @Override public void run() { try { c.await(); } catch (InterruptedException e) { e.printStackTrace(); } catch (BrokenBarrierException e) { e.printStackTrace(); } System.out.println(1); } }).start(); try { c.await(); } catch (InterruptedException e) { e.printStackTrace(); } catch (BrokenBarrierException e) { e.printStackTrace(); } System.out.println(2); }}
public class CyclicBarrierTest2 { static CyclicBarrier c = new CyclicBarrier(2,new A()); public static void main(String[] args) { new Thread(new Runnable() { @Override public void run() { try { c.await(); } catch (InterruptedException e) { e.printStackTrace(); } catch (BrokenBarrierException e) { e.printStackTrace(); } System.out.println(1); } }).start(); try { c.await(); } catch (InterruptedException e) { e.printStackTrace(); } catch (BrokenBarrierException e) { e.printStackTrace(); } System.out.println(2); } static class A implements Runnable{ @Override public void run() { System.out.println(3); } }}
public class BankWaterService implements Runnable { private CyclicBarrier c = new CyclicBarrier(4,this); private Executor executor = Executors.newFixedThreadPool(4); private ConcurrentHashMapsheetBankWaterCount = new ConcurrentHashMap<>(); private void count(){ for (int i=0;i<4;i++){ executor.execute(new Runnable() { @Override public void run() { sheetBankWaterCount.put(Thread.currentThread().getName(),1); try { c.await(); } catch (InterruptedException e) { e.printStackTrace(); } catch (BrokenBarrierException e) { e.printStackTrace(); } } }); } } @Override public void run() { int result = 0; for (Map.Entry sheet: sheetBankWaterCount.entrySet() ) { result += sheet.getValue(); } sheetBankWaterCount.put("result",result); System.out.println(result); } public static void main(String[] args) { BankWaterService bankWaterService = new BankWaterService(); bankWaterService.count(); }}
3.两者的区别
1. CountDownLatch只能用一次,CyclicBarrier可以reset(),且适合处理更复杂的业务 2. CyclicBarrier还有getNumberWaiting 获取当前阻塞的线程数量,isBroken()了解阻塞线程是否被中断public class CyclicBarrierTest3 { static CyclicBarrier c = new CyclicBarrier(2); public static void main(String[] args) { Thread thread = new Thread(new Runnable() { @Override public void run() { try { c.await(); } catch (InterruptedException e) { e.printStackTrace(); } catch (BrokenBarrierException e) { e.printStackTrace(); } } }); thread.start(); thread.interrupt(); try { c.await(); } catch (InterruptedException e) { e.printStackTrace(); } catch (BrokenBarrierException e) { //e.printStackTrace(); System.out.println(c.isBroken()); } }}
public class SemaphoreTest { private static final int THREAD_COUNT = 30; private static ExecutorService pool = Executors.newFixedThreadPool(THREAD_COUNT); private static Semaphore s = new Semaphore(10); public static void main(String[] args) { for (int i = 0; i < THREAD_COUNT; i++) { pool.execute(new Runnable() { @Override public void run() { try { s.acquire(); } catch (InterruptedException e) { e.printStackTrace(); } } }); } pool.shutdown(); }}
public static final Exchangerexgr = new Exchanger<>(); public static ExecutorService pool = Executors.newFixedThreadPool(2); public static void main(String[] args) { pool.execute(new Runnable() { @Override public void run() { String A = "B"; try { exgr.exchange(A); } catch (InterruptedException e) { e.printStackTrace(); } } }); pool.execute(new Runnable() { @Override public void run() { try { String B ="B"; String A = exgr.exchange("B"); System.out.println("是否一致"+A.equals(B)+"A:::"+A+"B:::"+B); } catch (InterruptedException e) { e.printStackTrace(); } } }); pool.shutdown(); }} //output 是否一致trueA:::BB:::B
转载地址:http://eqiii.baihongyu.com/