1.CountDownLatch
这个工具主要是将一个任务分解,等待所有的子任务完成才会做下面的操作,这个等待的操作主要是await控制的。计数值不能被重置,需要重置的情况需要使用CyclicBarrier。
下面的例子发现所有的线程都执行完成,才会打印done。
如果注释掉latch.await(); 发现done是在中间打印的,没有等待子任务都完成就执行了。
package concurrent; import java.util.concurrent.CountDownLatch; public class TestCountDownLatch { public static void main(String[] args) throws InterruptedException { final CountDownLatch latch = new CountDownLatch(10); for(int i= 0; i<10;i++){ new Thread(new Runnable() { public void run() { // TODO Auto-generated method stub System.out.println(Thread.currentThread().getName() +"--> begin"); try { Thread.sleep(100); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } System.out.println(Thread.currentThread().getName()+"--> end"); latch.countDown(); } },String.valueOf(i)).start(); } latch.await(); System.out.println("done------------"); } }
2.CyclicBarrier
这个工具主要是每个任务有多个阶段,如第三个阶段开始的前提必须是第二个阶段的所有人完成了任务。
可以向CyclicBarrier 其中注入runnable对象,这样计数器到达0时候自动触发该事件,同时计数值重置。
package concurrent; import java.util.concurrent.BrokenBarrierException; import java.util.concurrent.CyclicBarrier; public class TestCyclicBarrier { private final static CyclicBarrier cyclicBarrier = new CyclicBarrier(10,new Runnable() { public void run() { System.out.println("新的任务开始啦"); } }); public static void main(String[] args) throws InterruptedException { for(int i= 0; i<10;i++){ new Thread(new Runnable() { public void run() { // TODO Auto-generated method stub System.out.println(Thread.currentThread().getName() +"--> begin run"); try { cyclicBarrier.await(); } catch (InterruptedException e1) { // TODO Auto-generated catch block e1.printStackTrace(); } catch (BrokenBarrierException e1) { // TODO Auto-generated catch block e1.printStackTrace(); } System.out.println(Thread.currentThread().getName() +"--> begin jump"); try { cyclicBarrier.await(); } catch (InterruptedException e1) { // TODO Auto-generated catch block e1.printStackTrace(); } catch (BrokenBarrierException e1) { // TODO Auto-generated catch block e1.printStackTrace(); } System.out.println(Thread.currentThread().getName() +"--> begin walk"); try { cyclicBarrier.await(); } catch (InterruptedException e1) { // TODO Auto-generated catch block e1.printStackTrace(); } catch (BrokenBarrierException e1) { // TODO Auto-generated catch block e1.printStackTrace(); } try { Thread.sleep(100); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } System.out.println(Thread.currentThread().getName()+"--> end"); } },String.valueOf(i)).start(); } } }
执行结果
0--> begin run 3--> begin run 2--> begin run 1--> begin run 5--> begin run 4--> begin run 7--> begin run 6--> begin run 9--> begin run 8--> begin run 新的任务开始啦 8--> begin jump 3--> begin jump 1--> begin jump 4--> begin jump 0--> begin jump 9--> begin jump 6--> begin jump 7--> begin jump 5--> begin jump 2--> begin jump 新的任务开始啦 2--> begin walk 1--> begin walk 9--> begin walk 6--> begin walk 4--> begin walk 3--> begin walk 8--> begin walk 5--> begin walk 7--> begin walk 0--> begin walk 新的任务开始啦 7--> end 5--> end 3--> end 9--> end 6--> end 8--> end 4--> end 2--> end 1--> end 0--> end
3.Semaphor
计数器的价值在于控制只能有n个子任务访问某个资源。如下面的例子,只能同时存在三个进程。
package concurrent; import java.util.concurrent.Semaphore; public class TestSemaphor { static Semaphore semaphore = new Semaphore(3, true); public static void main(String[] args) { for(int i= 0; i<10;i++){ new Thread(new Runnable() { public void run() { // TODO Auto-generated method stub try { semaphore.acquire(); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } System.out.println(Thread.currentThread().getName() +"--> begin "); try { Thread.currentThread().sleep(10000); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } // System.out.println(Thread.currentThread().getName()+"--> end"); semaphore.release(); } },String.valueOf(i)).start(); } } }
相关推荐
《Java并发编程实战》这本书是关于Java语言中并发编程技术的经典著作。它详细介绍了如何在Java环境中有效地实现多线程程序和并发控制机制。在Java平台上,由于其本身提供了强大的并发编程支持,因此,掌握并发编程...
- **`java.util.concurrent` 包** 提供了丰富的并发工具类,如`ExecutorService`用于管理线程池,`Semaphore`用于许可证管理,`CountDownLatch`用于同步多个线程,`CyclicBarrier`用于多线程间的协作等。...
《Java并发编程实战》是Java并发编程领域的一本经典著作,它深入浅出地介绍了如何在Java平台上进行高效的多线程编程。这本书的源码提供了丰富的示例,可以帮助读者更好地理解书中的理论知识并将其应用到实际项目中。...
此外,书中可能还会涉及其他并发编程相关的高级话题,比如原子变量(`AtomicInteger`, `AtomicReference`等)、并发工具类(如`CountDownLatch`, `CyclicBarrier`, `Semaphore`)以及Fork/Join框架。这些工具可以...
### 并发编程——并发工具类 #### 知识点概述 并发编程是Java编程中的高级主题,主要目的是为了让程序能够充分利用多核CPU的优势,提高程序的执行效率。并发工具类则是Java中用于支持多线程协作和同步控制的一系列...
《Java并发编程的艺术》这本书是Java开发者深入理解并发编程的重要参考书籍。这本书全面地介绍了Java平台上的并发和多线程编程技术,旨在帮助开发者解决在实际工作中遇到的并发问题,提高程序的性能和可伸缩性。 ...
除了锁,Java还提供了其他同步机制,如`java.util.concurrent`包下的并发工具类。其中包括`Semaphore`(信号量)用于限制同时访问特定资源的线程数量,`CountDownLatch`(倒计时器)用于一次性阻塞多个线程,直到...
《JAVA并发编程艺术》是Java开发者深入理解和掌握并发编程的一本重要著作,它涵盖了Java并发领域的核心概念和技术。这本书详细阐述了如何在多线程环境下有效地编写高效、可靠的代码,对于提升Java程序员的技能水平...
5. **并发工具类**:如`CountDownLatch`、`CyclicBarrier`、`Semaphore`和`Phaser`等,它们为多线程间的协作提供了方便。 6. **活锁与死锁**:活锁是两个或更多线程相互等待对方释放资源,导致无限期等待;死锁则是...
最后,作者还讨论了并发编程的最佳实践,包括线程池的使用、Future和Callable接口,以及如何通过并发工具类来简化异步编程。这些内容有助于开发者编写出更加优雅、可维护的并发代码。 附带的源码文件可能是书中示例...
第一部分介绍了并发编程的基础,包括线程安全性的概念,如何构建线程安全的类,以及Java平台提供的并发工具如线程、同步机制等。这部分内容有助于开发者理解并发编程的基本原理和最佳实践。 第二部分讨论了如何构建...
在Java编程领域,并发编程是一项核心技能,尤其是在大型系统或分布式应用中,高效地处理多线程和并发操作是至关重要的。"Java并发编程与实践"文档深入剖析了这一主题,旨在帮助开发者理解和掌握如何在Java环境中有效...
最后,学习并发编程也涉及到选择合适的编程语言和工具。目前多数高级编程语言如Java、C#、Go等都内置了强大的并发支持,提供了线程、协程等并发原语,有助于简化并发编程的复杂性。此外,一些并发编程库和框架也能够...
Java并发编程是软件开发中的一个关键领域,尤其是在大型企业级应用和分布式系统中。通过学习相关的书籍,开发者可以深入理解如何有效地设计和实现高效的多线程应用程序,避免并发问题,如竞态条件、死锁、活锁等。...
Java并发编程是Java开发中的重要领域,特别是在多核处理器和分布式系统中,高效地利用并发可以极大地提升程序的性能和响应速度。这份“java并发编程内部分享PPT”显然是一个深入探讨这一主题的资料,旨在帮助开发者...
### C++并发编程实践 #### 一、简介与并发编程基础 《C++并发编程实践》这本书由Anthony Williams编写,是一本深入讲解C++多线程编程技术的专业书籍。本书旨在帮助读者掌握C++中的并发编程技巧,并通过大量的示例...
│ 高并发编程第二阶段43讲、类加载的过程以及类主动使用的六种情况详细介绍.mp4 │ 高并发编程第二阶段44讲、被动引用和类加载过程的练习巩固训练题.mp4 │ 高并发编程第二阶段45讲、ClassLoader加载阶段发生的...