http://bughope.iteye.com/blog/2081935
在上一篇文章中写道用一个静态的变量保存线程的执行状态,并用时间等待的方法后来仔细考虑,其实是
线程不安全的.多个线程同时执行这个类时,这个静态变量的值就不能保证了.
用一个线程同步的Map保存这个值,勉强能实现[每个线程生产一个不重复的map的key]
但是这样很麻烦.
却能完美的实现.能线程安全的计数,因为每个实现的主线程在并发的情况下java.util.concurrent.CountDownLatch; 是新的实例 不会像上一篇一样需要处理计数器的线程安全.
具体代码如下
package org.masque.effective; import java.util.concurrent.CountDownLatch; import java.util.concurrent.TimeUnit; /** * * @author masque.java@gmail.com * */ public class ThreadTest { public static void main(String[] args) throws InterruptedException { CountDownLatch latch=new CountDownLatch(3);//数量标示线程的个数 (new Thread1(latch)).start(); (new Thread2(latch)).start(); (new Thread3(latch)).start(); latch.await();//等待线程执行完成.还有一个重载的方法可以设置超时时间 System.out.println("over!"); } } class Thread1 extends Thread{ CountDownLatch latch; public Thread1(CountDownLatch latch){ this.latch = latch; } @Override public void run() { for (int i=10;i<20;i++) { System.out.println("Thread1===========:"+i); try { TimeUnit.SECONDS.sleep(1); } catch (InterruptedException e) { e.printStackTrace(); } } latch.countDown();//完成后计数 } } class Thread2 extends Thread{ CountDownLatch latch; public Thread2(CountDownLatch latch){ this.latch = latch; } @Override public void run() { for (int i=10;i<20;i++) { System.out.println("Thread2===========:"+i); try { TimeUnit.SECONDS.sleep(1); } catch (InterruptedException e) { e.printStackTrace(); } } latch.countDown();//完成后计数 } } class Thread3 extends Thread{ CountDownLatch latch; public Thread3(CountDownLatch latch){ this.latch = latch; } @Override public void run() { for (int i=10;i<20;i++) { System.out.println("Thread3===========:"+i); try { TimeUnit.SECONDS.sleep(1); } catch (InterruptedException e) { e.printStackTrace(); } } latch.countDown();//完成后计数 } }
相关推荐
利用 CountDownLatch 类实现线程同步,而不用回调机制。详见我的博文 http://blog.csdn.net/kroclin/article/details/37956949
具有countDownLatch的线程同步模式
mybaits 多线程 实现数据批量插入 (运用CountDownLatch实现闭锁) 1、mybatis批处理 2、数据分批量查询 3、数据分批量插入
主要介绍了如何使用CountDownLatch同步java多线程,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
主要介绍了Java中CountDownLatch进行多线程同步详解及实例代码的相关资料,需要的朋友可以参考下
NULL 博文链接:https://cpjsjxy.iteye.com/blog/2272451
这是一个对于Java CountDownLatch的简单Demo CountDownLatch一个同步辅助类 在完成一组正在其他线程中执行的操作之前 它允许一个或多个线程一直等待 用给定的计数 初始化 CountDownLatch 由于调用了 countDown 方法 ...
主要介绍了Java多线程编程之CountDownLatch同步工具使用实例,需要的朋友可以参考下
本篇文章主要介绍了Java中多线程同步类 CountDownLatch的相关知识,具有很好的参考价值。下面跟着小编一起来看下吧
1.1 并发编程与线程同步 1.2 CountDownLatch概述 CountDownLatch的基本用法 2.1 创建CountDownLatch对象 2.2 await()方法 2.3 countDown()方法 实现多线程任务的同步 3.1 场景介绍 3.2 使用CountDownLatch实现同步 ...
上文介绍了CountDownLatch,CountDownLatch虽然可以实现多个线程同步,但是只能使用一次。而本文所要介绍的CycliBarrier,比CountDownLatch强大许多,可以使用多次。下面会从源码角度通透解析CyclicBarrier,觉得不错...
目录线程安全 Thread Safety重入锁 ReentrantLock读写锁 ReadWriteLock倒计数器 CountDownLatch循环栅栏 CyclicBarrier信号量 Semaphore 线程安全 Thread Safety JMM JMM(Java Memory Model)是一种基于计算机内存...
在Java中和ReadWriteLock.ReadLock一样,CountDownLatch的本质也是一个"共享锁",这里我们就来详解Java多线程编程中CountDownLatch阻塞线程的方法:
CountDownLatch 和 CyclicBarrier 为线程同步的辅助工具,通过它可以做到使一条线程一直阻塞等待,直到其他线程完成其所处理的任务。
主要为大家详细介绍了使用CountDownLatch等待多线程全部执行完成,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
1)CountDownLatch(同步倒数计数器:等待多线程(或者多步骤)完成) 2)CyclicBarrier(循环屏障:同步屏障) 3)Semaphore(信号量:控制并发进程数) 主要参考资料:java并发编程的艺术、Java并发——...
主要介绍了JAVA多线程CountDownLatch的使用,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
主要为大家详细介绍了CountDownLatch的使用说明,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
主要介绍了Java多线程同步器代码详解,文章分别介绍了是CountDownLatch,Semaphore,Barrier和Exchanger以及其相关代码示例,具有一定参考价值,需要的朋友可以了解下。
《java并发编程》中CountDownLatch和CyclicBarrier用法实例大全,几乎包含了所有重要的用法