并发编程JUC系列AQS(CountDownLatch、CyclicBar…
2018-07-25 13:06:39来源:博客园 阅读 ()
一、CountDownLatch
package com.jonychen.test; import java.util.concurrent.CountDownLatch; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; /** * 并发编程java.util.concurrent(JUC) * AQS(AbstractQueuedSynchronizer) */ public class JUCAQSDemo { public static void main(String[] args){ /** * CountDownLatch用来控制一个线程等待多个线程,维护一个计数器cnt,
* 每次调用countDown()会让计数器的值减一, 减到零时,
* 那些因为调用await()方法而在等待的线程会被唤醒 */ final int totalThread=10; CountDownLatch countDownLatch =new CountDownLatch(totalThread); ExecutorService executorService =Executors.newCachedThreadPool(); for (int i = 0; i < totalThread; i++) { executorService.execute(()->{ System.out.println("jonychen run"); countDownLatch.countDown(); }); } try { countDownLatch.await(); System.out.println("end..."); executorService.shutdown(); } catch (InterruptedException e) { e.printStackTrace(); } } }
运行截图:
二、CyclicBarrier
1 package com.jonychen.thread; 2 3 import java.util.concurrent.BrokenBarrierException; 4 import java.util.concurrent.CyclicBarrier; 5 import java.util.concurrent.ExecutorService; 6 import java.util.concurrent.Executors; 7 8 /** 9 * 并发编程java.util.concurrent(JUC) 10 * AQS(AbstractQueuedSynchronizer) 11 */ 12 public class JUCAQSCycliBarrier { 13 /** 14 *CyclicBarrier用来控制多个线程相互等待,只有当多个线程都到达时,这些线程才会继续执行, 15 * 和CountDownLatch相似,都是通过维护计数器实现的,但他的计数器是递增的。每次执行await() 16 * 方法后,计数器会加1,直到计数器的值和设置的值相同,等待的所有线程才会继续执行,和CountDownLatch 17 * 的另一个区别是,CyclicBarrier的计数器可以循环使用,所以才叫他循环屏障 18 */ 19 public static void main(String[] args){ 20 final int totalThread=10; 21 CyclicBarrier cyclicBarrier =new CyclicBarrier(totalThread); 22 ExecutorService executorService=Executors.newCachedThreadPool(); 23 for (int i = 0; i < totalThread; i++) { 24 executorService.execute(()->{ 25 System.out.println("before..*"); 26 try { 27 cyclicBarrier.await(); 28 } catch (InterruptedException e) { 29 e.printStackTrace(); 30 } catch (BrokenBarrierException e) { 31 e.printStackTrace(); 32 } 33 System.out.print("after "); 34 }); 35 } 36 executorService.shutdown(); 37 } 38 }
运行截图:
三、Semaphore
package com.jonychen.thread; import sun.misc.Cleaner; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import java.util.concurrent.Semaphore; /** * 并发编程java.util.concurrent(JUC) * AQS(AbstractQueuedSynchronizer) */ public class JUCAQSSemaphore { public static void main(String[] args){ /** *Semaphore就是操作系统中的信号量,可以控制对互斥资源的访问线程数 *以下代码模拟了对某个服务的并发请求,每次只能有30个客户端同时访问,请求总数为 10。 */ final int clientCount=30; final int totalRequestCount=10; Semaphore semaphore =new Semaphore(clientCount); ExecutorService executorService=Executors.newCachedThreadPool(); for (int i = 0; i < totalRequestCount; i++) { executorService.execute(()->{ try { semaphore.acquire(); System.out.println(semaphore.availablePermits() + ""); } catch (InterruptedException e) { e.printStackTrace(); }finally { semaphore.release(); } }); } executorService.shutdown(); } }
运行截图:
标签:
版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有
下一篇:java线程池源码浅析
- 因为命名被diss无数次。简单聊聊编程最头疼的事情之一:命名 2020-06-10
- Java3个编程题整理 2020-06-09
- (易忘篇)java基础编程难点4 2020-06-08
- (易忘篇)java基础编程难点3 2020-06-05
- 国外大佬总结的 10 个 Java 编程技巧! 2020-06-04
IDC资讯: 主机资讯 注册资讯 托管资讯 vps资讯 网站建设
网站运营: 建站经验 策划盈利 搜索优化 网站推广 免费资源
网络编程: Asp.Net编程 Asp编程 Php编程 Xml编程 Access Mssql Mysql 其它
服务器技术: Web服务器 Ftp服务器 Mail服务器 Dns服务器 安全防护
软件技巧: 其它软件 Word Excel Powerpoint Ghost Vista QQ空间 QQ FlashGet 迅雷
网页制作: FrontPages Dreamweaver Javascript css photoshop fireworks Flash