`

并发编程工具类

 
阅读更多

 

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();
		}
	}

}

 

1
1
分享到:
评论

相关推荐

    Java 并发编程实战.pdf

    《Java并发编程实战》这本书是关于Java语言中并发编程技术的经典著作。它详细介绍了如何在Java环境中有效地实现多线程程序和并发控制机制。在Java平台上,由于其本身提供了强大的并发编程支持,因此,掌握并发编程...

    java并发编程2

    - **`java.util.concurrent` 包** 提供了丰富的并发工具类,如`ExecutorService`用于管理线程池,`Semaphore`用于许可证管理,`CountDownLatch`用于同步多个线程,`CyclicBarrier`用于多线程间的协作等。...

    java并发编程实战源码,java并发编程实战pdf,Java

    《Java并发编程实战》是Java并发编程领域的一本经典著作,它深入浅出地介绍了如何在Java平台上进行高效的多线程编程。这本书的源码提供了丰富的示例,可以帮助读者更好地理解书中的理论知识并将其应用到实际项目中。...

    java并发编程艺术

    此外,书中可能还会涉及其他并发编程相关的高级话题,比如原子变量(`AtomicInteger`, `AtomicReference`等)、并发工具类(如`CountDownLatch`, `CyclicBarrier`, `Semaphore`)以及Fork/Join框架。这些工具可以...

    并发编程——并发工具类.pdf

    ### 并发编程——并发工具类 #### 知识点概述 并发编程是Java编程中的高级主题,主要目的是为了让程序能够充分利用多核CPU的优势,提高程序的执行效率。并发工具类则是Java中用于支持多线程协作和同步控制的一系列...

    java 并发编程的艺术pdf清晰完整版 源码

    《Java并发编程的艺术》这本书是Java开发者深入理解并发编程的重要参考书籍。这本书全面地介绍了Java平台上的并发和多线程编程技术,旨在帮助开发者解决在实际工作中遇到的并发问题,提高程序的性能和可伸缩性。 ...

    汪文君高并发编程实战视频资源下载.txt

    │ 高并发编程第二阶段43讲、类加载的过程以及类主动使用的六种情况详细介绍.mp4 │ 高并发编程第二阶段44讲、被动引用和类加载过程的练习巩固训练题.mp4 │ 高并发编程第二阶段45讲、ClassLoader加载阶段发生的...

    《java 并发编程实战高清PDF版》

    除了锁,Java还提供了其他同步机制,如`java.util.concurrent`包下的并发工具类。其中包括`Semaphore`(信号量)用于限制同时访问特定资源的线程数量,`CountDownLatch`(倒计时器)用于一次性阻塞多个线程,直到...

    JAVA并发编程艺术pdf版

    《JAVA并发编程艺术》是Java开发者深入理解和掌握并发编程的一本重要著作,它涵盖了Java并发领域的核心概念和技术。这本书详细阐述了如何在多线程环境下有效地编写高效、可靠的代码,对于提升Java程序员的技能水平...

    Java并发编程实践高清pdf及源码

    5. **并发工具类**:如`CountDownLatch`、`CyclicBarrier`、`Semaphore`和`Phaser`等,它们为多线程间的协作提供了方便。 6. **活锁与死锁**:活锁是两个或更多线程相互等待对方释放资源,导致无限期等待;死锁则是...

    JAVA并发编程实践.pdf+高清版+目录 书籍源码

    最后,作者还讨论了并发编程的最佳实践,包括线程池的使用、Future和Callable接口,以及如何通过并发工具类来简化异步编程。这些内容有助于开发者编写出更加优雅、可维护的并发代码。 附带的源码文件可能是书中示例...

    Java并发编程实战华章专业开发者书库 (Tim Peierls 等 美Brian Goetz).pdf

    第一部分介绍了并发编程的基础,包括线程安全性的概念,如何构建线程安全的类,以及Java平台提供的并发工具如线程、同步机制等。这部分内容有助于开发者理解并发编程的基本原理和最佳实践。 第二部分讨论了如何构建...

    java并发编程与实践

    在Java编程领域,并发编程是一项核心技能,尤其是在大型系统或分布式应用中,高效地处理多线程和并发操作是至关重要的。"Java并发编程与实践"文档深入剖析了这一主题,旨在帮助开发者理解和掌握如何在Java环境中有效...

    深入理解并发编程

    最后,学习并发编程也涉及到选择合适的编程语言和工具。目前多数高级编程语言如Java、C#、Go等都内置了强大的并发支持,提供了线程、协程等并发原语,有助于简化并发编程的复杂性。此外,一些并发编程库和框架也能够...

    java并发编程书籍

    Java并发编程是软件开发中的一个关键领域,尤其是在大型企业级应用和分布式系统中。通过学习相关的书籍,开发者可以深入理解如何有效地设计和实现高效的多线程应用程序,避免并发问题,如竞态条件、死锁、活锁等。...

    java并发编程内部分享PPT

    Java并发编程是Java开发中的重要领域,特别是在多核处理器和分布式系统中,高效地利用并发可以极大地提升程序的性能和响应速度。这份“java并发编程内部分享PPT”显然是一个深入探讨这一主题的资料,旨在帮助开发者...

    C++并发编程实践 C++ Concurrency in Action

    ### C++并发编程实践 #### 一、简介与并发编程基础 《C++并发编程实践》这本书由Anthony Williams编写,是一本深入讲解C++多线程编程技术的专业书籍。本书旨在帮助读者掌握C++中的并发编程技巧,并通过大量的示例...

Global site tag (gtag.js) - Google Analytics