- 浏览: 415223 次
- 性别:
- 来自: 深圳
文章分类
最新评论
-
Glogo:
楼主您好,我在试验您的代码的时候发现新开的三个子线程并没有一直 ...
java 高并发 ReentrantLock -- 可重入的锁 -
univasity:
最近发觉也被限速了,投诉一下就好一会~~ 看来明天又要和电信M ...
ADSL上网速度慢 都是帐号限速惹的祸 -
liuyuanhui0301:
java 高并发 ReentrantLock -- 可重入的锁 -
dang_java:
呵.很好的说明文档.
JXTA技术与应用发展 -
helloqidi:
谢谢,学习了
SQL中exists和in的区别
在多线程设计中,我猜常常会遇到线程间相互等待以及某个线程等待1个或多个线程的场景,比如多线程精密计算和大量数据处理,这里写下我自己的体会和理解。
我想应该有很多办法,如果是简单的1:1关系,那么可以wait()和notify()解决,就像一把锁和一把钥匙;如果是1:N关系,这个1就需要关心N的所有状态了,最笨的办法是1可以去查看N当前的状态,轮询询问工作是否做完。而好点的办法是N做完后主动告诉1,然后N就会有2种选择,要么听从1的命令,要么继续干自己其他的活。 用传统的方法我想应该是都能实现的,而JDK1.5提供了CyclicBarrier与CountDownLatch来解决了这两个问题,而她们的区别是: CyclicBarrier使所有线程相互等待,而CountDownLatch使一个或多个线程等待其他线程。区别类似上面蓝色字体,CountDownLatch不会等待其他线程了,只要做完自己的工作就干自己的活去了,也就是run()方法里其他的任务。 Example: 输出的结果为: The bow is coming 如上所说do other thing不受影响。 写了一个CyclicBarrier的例子: 输出结果为: Wait... 这应该是CyclicBarrier吧?
public static void testCountDownLatch() throws InterruptedException{
CountDownLatch cdl=new CountDownLatch(2);
ExecutorService exe=Executors.newFixedThreadPool(2);
class Bow implements Runnable{
CountDownLatch cdl;
public Bow(CountDownLatch cdl){
this.cdl=cdl;
}
public void run(){
System.out.println("The bow is coming");
System.out.println("kick a bow ");
this.cdl.countDown();
System.out.println("do other thing");
}
}
exe.execute(new Bow(cdl));
exe.execute(new Bow(cdl));
exe.shutdown();
System.out.println("Wait...");
cdl.await();
System.out.println("End..");
}
public static void main(String[] args) {
try {
Test.testCountDownLatch();
} catch (InterruptedException e) {
}
}
kick a bow
do other thing
Wait...
The bow is coming
kick a bow
do other thing
End..
public static void testCyclicBarrier() throws InterruptedException, BrokenBarrierException{
CyclicBarrier barr=new CyclicBarrier(2+1);
ExecutorService exe=Executors.newFixedThreadPool(2);
class Bow implements Runnable{
CyclicBarrier barr;
public Bow(CyclicBarrier barr){
this.barr=barr;
}
public void run(){
System.out.println("The bow is coming");
System.out.println("kick a down");
try {
barr.await();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (BrokenBarrierException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println("do other thing");
}
}
exe.execute(new Bow(barr));
exe.execute(new Bow(barr));
exe.shutdown();
System.out.println("Wait...");
barr.await();
System.out.println("End..");
}
public static void main(String[] args) {
try {
Test.testCyclicBarrier();
} catch (InterruptedException e) {
}
catch (BrokenBarrierException e) {
}
}
The bow is coming
kick a down
The bow is coming
kick a down
do other thing
End..
do other thing
兄弟你的例子来说明问题似乎让人不好琢磨。我也写了两个例子,大家一起学习下
public class CyclicBarrierTest {
public static void main(String[] args) {
ExecutorService service = Executors.newCachedThreadPool();
final CyclicBarrier cb = new CyclicBarrier(3);//构造方法里的数字标识有几个线程到达集合地点开始进行下一步工作
for(int i=0;i<3;i++){
Runnable runnable = new Runnable(){
public void run(){
try {
Thread.sleep((long)(Math.random()*10000));
System.out.println("线程" + Thread.currentThread().getName() +
"即将到达集合地点1,当前已有" + cb.getNumberWaiting() + "个已经到达,正在等候");
cb.await();
Thread.sleep((long)(Math.random()*10000));
System.out.println("线程" + Thread.currentThread().getName() +
"即将到达集合地点2,当前已有" + cb.getNumberWaiting() + "个已经到达,正在等候");
cb.await();
Thread.sleep((long)(Math.random()*10000));
System.out.println("线程" + Thread.currentThread().getName() +
"即将到达集合地点3,当前已有" + cb.getNumberWaiting() + "个已经到达,正在等候");
cb.await();
} catch (Exception e) {
e.printStackTrace();
}
}
};
service.execute(runnable);
}
service.shutdown();
}
}
发表评论
-
深入JVM锁机制
2011-09-19 01:00 944目前在Java中存在两种 ... -
java 正则表达式 非捕获组(特殊构造)Special Constructs(Non-Capturing)
2011-06-20 23:15 1598针对Java API文档中的正则表达式关于特殊构造(非捕获组) ... -
Java文件映射[mmap]揭秘
2011-06-08 20:10 1094前言 相信现在 ... -
原创 java的Mmap二三事
2011-06-08 19:46 1155转自 :http://blog.csdn.net/kabini ... -
java 安全沙箱模型详解
2011-04-18 16:29 906起到第一道安全保障作 ... -
非阻塞算法-ReentrantLock代码剖析之ReentrantLock.lock
2011-04-15 13:59 1047ReentrantLock是java.util.concurr ... -
Java KeyStore
2011-04-13 17:17 1425简介Java自带的keytool工具是个密钥和证书管理工具。它 ... -
Security Managers and the JavaTM 2 SDK
2011-04-12 13:37 738The original Link : http://do ... -
Something about SecurityManager
2011-04-12 13:33 748The Java Security was made up o ... -
Using the Java SecurityManager with Tomcat
2011-04-12 13:30 958Why use a SecurityManager? The ... -
Java安全管理器(Security Manager)(
2011-04-11 14:54 856转载自: http://blog.sina.com.cn/s/ ... -
Java对象的强、软、弱和虚引用(1)
2011-04-01 08:44 771本文介绍Java对象的强 ... -
Java对象的强引用、软引用、弱引用和虚引用
2011-04-01 08:39 871在JDK1.2以前的版本中, ... -
java 高并发 ReentrantLock -- 可重入的锁
2011-03-30 08:09 2286ReentrantLock -- 可重入的锁 可重入锁指 ... -
线程运行栈信息的获取
2011-03-24 17:23 1270线程运行栈信息的获取 ... -
java序列化——Serializable
2011-03-15 23:17 1033类通过实现 java.io.Serializable 接口 ... -
Java aio(异步网络IO)初探
2011-03-11 16:34 1524按照《Unix网络编程》的 ... -
JAVA NIO 简介
2011-03-11 13:38 10801. 基本 概念 IO 是主存和外部设备 ( 硬盘、终 ... -
[字节码系列]ObjectWeb ASM构建Method Monitor
2011-03-08 18:08 830在前面的篇章中,我们看到Java Instru ... -
深入了解Java ClassLoader、Bytecode 、ASM、cglib
2011-03-08 16:35 829一、Java ClassLoader 1,什 ...
相关推荐
《java并发编程》中CountDownLatch和CyclicBarrier用法实例大全,几乎包含了所有重要的用法
目录: 简介 1.1 并发编程与线程协作 1.2 CyclicBarrier概述 CyclicBarrier的基本用法 2.1 创建CyclicBarrier对象 2.2 await()方法 控制线程协作数量 ...CyclicBarrier与CountDownLatch的对比 最佳实践与注意事项
1. 什么是线程? 2. 线程和进程有什么区别? 3. 如何在 Java 中实现...7. Java 中 CyclicBarrier 和 CountDownLatch 有什么不同? 8. Java 内存模型是什么? 9. Java 中的 volatile 变量是什么? ......... ........
有以下类的实例: ThreadPool ScheduledThread CyclicBarrier BlockingQueue CountDownLatch FutureTask CompletionService Semaphore
java并发编程中CountDownLatch和CyclicBarrier的使用借鉴.pdf
CyclicBarrier和CountDownLatch一样,都是关于线程的计数器。用法略有不同,测试代码如下:
java并发之并发工具类,并发工具类有很多,这里主要介绍了CyclicBarrier、CountDownLatch、Semaphore、Exchanger
java并发编程中CountDownLatch和CyclicBarrier的使用.pdf
CountDownLatch 和 CyclicBarrier 为线程同步的辅助工具,通过它可以做到使一条线程一直阻塞等待,直到其他线程完成其所处理的任务。
与CountDownLatch不同的是,CyclicBarrier可以重复使用,即当所有线程都到达屏障后,屏障会自动重置,可以继续使用。 CyclicBarrier的构造方法如下: java public CyclicBarrier(int parties, Runnable ...
Java并发编程一CountDownLatch、CyclicBarrier、Semaphore初使用 CountDownLatch、CyclicBarrier、Semaphore这些线程协作工具类是基于AQS的,看完这篇博客后可以去看下面这篇博客,了解它们是如何实现的。 Java并发...
java 高并发应用场景
主要介绍了Java并发编程:CountDownLatch与CyclicBarrier和Semaphore的实例详解的相关资料,需要的朋友可以参考下
主要介绍了详解java CountDownLatch和CyclicBarrier在内部实现和场景上的区别,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
CyclicBarrier的使用以及注意事项
CyclicBarrier类似于CountDownLatch也是个计数器,不同的是CyclicBarrier数的是调用了CyclicBarrier.await()进入等待的线程数,当线程数达到了CyclicBarrier初始时规定的数目时,所有进入等待状态的线程被唤醒并继续...
目录: 简介 1.1 并发编程与线程同步 1.2 CountDownLatch概述 CountDownLatch的基本用法 2.1 创建CountDownLatch对象 2.2 await()方法 ...CountDownLatch与CyclicBarrier的对比 最佳实践与注意事项
目录线程安全 Thread Safety重入锁 ReentrantLock读写锁 ReadWriteLock倒计数器 CountDownLatch循环栅栏 CyclicBarrier信号量 Semaphore 线程安全 Thread Safety JMM JMM(Java Memory Model)是一种基于计算机内存...
主要介绍了Java并发编程之栅栏(CyclicBarrier)实例介绍,栅栏类似闭锁,但是它们是有区别的,需要的朋友可以参考下