`
java--hhf
  • 浏览: 310803 次
  • 性别: Icon_minigender_1
社区版块
存档分类
最新评论

并行中的顺序执行——CountDownLatch

阅读更多

    java.util.concurrent.CountDownLatch : 一个同步辅助类,在完成一组正在其他线程中执行的操作之前,它允许一个或多个线程一直等待。--《JDK API 1.6.0》

    换句话说,你可以并行的执行一段代码,并设置等待所有的线程都执行完的点,然后再一起开始执行

    举例说,五个个人一起(并行)包饺子,只有等所有的饺子都包好以后才一起下锅,得,就这个意思咯。

其API相对来说比较简单:

构造方法摘要
CountDownLatch(int count)
构造一个用给定计数初始化的 CountDownLatch
方法摘要
void await()
使当前线程在锁存器倒计数至零之前一直等待,除非线程被中断
boolean await(long timeout, TimeUnit unit)
使当前线程在锁存器倒计数至零之前一直等待,除非线程被中断或超出了指定的等待时间。
void countDown()
递减锁存器的计数,如果计数到达零,则释放所有等待的线程。
long getCount()
返回当前计数。
String toString()
返回标识此锁存器及其状态的字符串。

 

从类 java.lang.Object 继承的方法
clone, equals, finalize, getClass, hashCode, notify, notifyAll, wait, wait, wait

实例:

public class CountDownLatchDemo {
	final static SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
    public static void main(String[] args) throws InterruptedException {
    	CountDownLatch latch=new CountDownLatch(2);//两个线程并行
    	Worker worker1=new Worker("zhang san", 5000, latch);
    	Worker worker2=new Worker("li si", 8000, latch);
    	worker1.start();//
    	worker2.start();//
    	latch.await();//等待所有工人完成工作点
        System.out.println("all work done at "+sdf.format(new Date()));
	}
        
    static class Worker extends Thread{
    	String workerName; 
    	int workTime;
    	CountDownLatch latch;
    	public Worker(String workerName ,int workTime ,CountDownLatch latch){
    		 this.workerName=workerName;
    		 this.workTime=workTime;
    		 this.latch=latch;
    	}
    	public void run(){
    		System.out.println("Worker "+workerName+" do work begin at "+sdf.format(new Date()));
    		doWork();//工作了
    		System.out.println("Worker "+workerName+" do work complete at "+sdf.format(new Date()));
    		latch.countDown();//工人完成工作,计数器减一

    	}
    	
    	private void doWork(){
    		try {
				Thread.sleep(workTime);
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
    	}
    }
         
}

实例输出:

Worker zhang san do work begin at 2015-01-03 21:26:38
Worker li si do work begin at 2015-01-03 21:26:38
Worker zhang san do work complete at 2015-01-03 21:26:43
Worker li si do work complete at 2015-01-03 21:26:46
all work done at 2015-01-03 21:26:46

 

0
1
分享到:
评论

相关推荐

    Parallel-Dijkstras:dijkstra的SSSP算法的并行实现,使用来自CPSC 5600的计数减少类

    并行Dijkstra算法的核心是将原本顺序执行的节点扩展过程分解为多个可并发执行的任务。这通常可以通过工作窃取、任务分割或者GPU加速等方法实现。在本实现中,采用了基于计数/归约类的并行化策略,计数/归约是并行...

    Mastering Concurrency Programming with Java 8

    - **避免假设执行顺序**:不要依赖特定的执行顺序。 - **局部变量优于共享变量**:减少线程间的数据共享,使用局部变量。 - **寻找更容易并行化的算法版本**:有些算法比其他算法更容易并行化。 - **使用不可变对象*...

    多线程面试题

    在计算机科学中,多线程是一种允许一个进程同时执行多个线程的技术,目的是为了提高程序的执行效率。多线程面试题往往会围绕线程的概念、特性、线程安全、锁机制以及多线程编程中可能遇到的问题和解决方案进行提问。...

    Concurrent+Programming+in+Java+-+Design+Principles+and+Patterns,+Second+Edition_

    第二章重点介绍了Java中三种类型的并发构造之一——排除。排除是确保并发安全性的一种基本机制,主要关注于如何保护共享资源不受多个线程的并发访问干扰。 ##### 2.1 不可变性 不可变性是指对象一旦创建之后其状态...

    BloodBank

    此外,Java的并发工具类,如Semaphore、CountDownLatch和CyclicBarrier,能够帮助开发者有效地控制并发执行的顺序和同步问题。 在安全性方面,BloodBank可能利用了Spring Security或者Apache Shiro这样的安全框架,...

    seminar_CTS

    【Java技术研讨会——seminar_CTS】 在本次"seminar_CTS"研讨会上,我们聚焦于Java这一广泛使用的编程语言,深入探讨了其核心概念、应用领域以及最新的技术趋势。Java以其“一次编写,到处运行”的特性,成为了企业...

Global site tag (gtag.js) - Google Analytics