线程高级应用-心得6-java5线程并发库中同步工具类(synchronizers),新知识大用途
1.新知识普及






2. Semaphore工具类的使用案例
package com.java5.thread.newSkill; import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Semaphore; /**
* Semaphore工具类的使用案例
* 跟互斥锁有点相似,只是互斥锁只有一把,信号灯可以有多个
* Semaphore:信号灯
*/
public class SemaphoreTest { public static void main(String[] args) { ExecutorService service = Executors.newCachedThreadPool();
//
final Semaphore sp = new Semaphore(3);
for(int i=0;i<10;i++){
Runnable runnable = new Runnable() { @Override
public void run() {
try {
//acquire:获得;下面方法是获取信号灯
sp.acquire();
} catch (InterruptedException e) {
e.printStackTrace();
}
//availablePermits():可以获得的许可
System.out.println("线程 "+Thread.currentThread().getName()+" 进入,当前已有 "+(3-sp.availablePermits())+" 个并发!"); try {
Thread.sleep((long)Math.random()*10000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("线程 "+Thread.currentThread().getName()+" 即将离开!");
//释放信号灯
sp.release();
//下面代码有时候执行不准确
System.out.println("线程 "+Thread.currentThread().getName()+" 离开,当前已有 "+(3-sp.availablePermits())+" 个并发!"); }
};
service.execute(runnable);
} }
} /*
* 运行结果:
线程 pool-1-thread-1 进入,当前已有 1 个并发!
线程 pool-1-thread-1 即将离开!
线程 pool-1-thread-1 离开,当前已有 0 个并发!
线程 pool-1-thread-1 进入,当前已有 1 个并发!
线程 pool-1-thread-1 即将离开!
线程 pool-1-thread-1 离开,当前已有 0 个并发!
线程 pool-1-thread-1 进入,当前已有 1 个并发!
线程 pool-1-thread-3 进入,当前已有 2 个并发!
线程 pool-1-thread-1 即将离开!
线程 pool-1-thread-1 离开,当前已有 1 个并发!
线程 pool-1-thread-3 即将离开!
线程 pool-1-thread-3 离开,当前已有 0 个并发!
线程 pool-1-thread-3 进入,当前已有 1 个并发!
线程 pool-1-thread-1 进入,当前已有 2 个并发!
线程 pool-1-thread-3 即将离开!
线程 pool-1-thread-3 离开,当前已有 1 个并发!
线程 pool-1-thread-1 即将离开!
线程 pool-1-thread-1 离开,当前已有 0 个并发!
线程 pool-1-thread-1 进入,当前已有 1 个并发!
线程 pool-1-thread-5 进入,当前已有 2 个并发!
线程 pool-1-thread-1 即将离开!
线程 pool-1-thread-1 离开,当前已有 1 个并发!
线程 pool-1-thread-5 即将离开!
线程 pool-1-thread-5 离开,当前已有 0 个并发!
线程 pool-1-thread-2 进入,当前已有 1 个并发!
线程 pool-1-thread-2 即将离开!
线程 pool-1-thread-2 离开,当前已有 0 个并发!
线程 pool-1-thread-4 进入,当前已有 1 个并发!
线程 pool-1-thread-4 即将离开!
线程 pool-1-thread-4 离开,当前已有 0 个并发! */
3. CyclicBarrier工具类的使用案例
package com.java5.thread.newSkill; import java.util.concurrent.CyclicBarrier;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors; /**
* CyclicBarrier工具类的使用案例
* 应用场景:各个线程彼此等待,到齐后集体出发
* cyclic:循环的,周期性的
* barrier:障碍物,屏障
*/
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() { @Override
public void run() {
try {
Thread.sleep((long)Math.random()*10000);
//cb.getNumberWaiting()+1;是因为该方法获取的数量是从0开始的
System.out.println("线程 "+ Thread.currentThread().getName()+" 即将到达集合地点1,当前已有 "+(cb.getNumberWaiting()+1)+"已经到达;"+(cb.getNumberWaiting()==2?"都到齐了,继续走啊!":"正在等候!"));
//想在什么地方集合就在什么地方await()等待
cb.await(); Thread.sleep((long)Math.random()*10000);
System.out.println("线程 "+ Thread.currentThread().getName()+" 即将到达集合地点2,当前已有 "+(cb.getNumberWaiting()+1)+"已经到达;"+(cb.getNumberWaiting()==2?"都到齐了,继续走啊!":"正在等候!")); cb.await(); Thread.sleep((long)Math.random()*10000);
System.out.println("线程 "+ Thread.currentThread().getName()+" 即将到达集合地点3,当前已有 "+(cb.getNumberWaiting()+1)+"已经到达;"+(cb.getNumberWaiting()==2?"都到齐了,继续走啊!":"正在等候!")); cb.await();
} catch (Exception e) {
e.printStackTrace();
}
}
};
service.execute(runnable);
}
service.shutdown();
} } /*
* 运行结果:
线程 pool-1-thread-2 即将到达集合地点1,当前已有 1已经到达;正在等候!
线程 pool-1-thread-3 即将到达集合地点1,当前已有 2已经到达;正在等候!
线程 pool-1-thread-1 即将到达集合地点1,当前已有 3已经到达;都到齐了,继续走啊!
线程 pool-1-thread-2 即将到达集合地点2,当前已有 1已经到达;正在等候!
线程 pool-1-thread-1 即将到达集合地点2,当前已有 2已经到达;正在等候!
线程 pool-1-thread-3 即将到达集合地点2,当前已有 3已经到达;都到齐了,继续走啊!
线程 pool-1-thread-3 即将到达集合地点3,当前已有 1已经到达;正在等候!
线程 pool-1-thread-2 即将到达集合地点3,当前已有 2已经到达;正在等候!
线程 pool-1-thread-1 即将到达集合地点3,当前已有 3已经到达;都到齐了,继续走啊!
*/ 4. CountDownLacth工具类的使用案例
package com.java5.thread.newSkill; import java.util.concurrent.CountDownLatch;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors; /**
* CountDownLacth工具类的使用案例
* 犹如倒计时计数器
* latch:门闩,闩门
* 应用场景:运动员比赛;裁判计时!一款比赛小游戏
* 下面例子:三个线程好比三个运动员,主线程好比一个裁判
*/
public class CountDownLatchTest { public static void main(String[] args) { ExecutorService service = Executors.newCachedThreadPool(); //设置一个数量为1的计时器
final CountDownLatch cdOrder = new CountDownLatch(1);
//设置一个数量为3的计时器
final CountDownLatch cdAnswer = new CountDownLatch(3);
for(int i=0;i<3;i++){
Runnable runnable= new Runnable() { @Override
public void run() {
try {
System.out.println("线程 "+ Thread.currentThread().getName()+"正准备接受命令!"); /*开启三个线程,都在这里等待;
* 如何开始下一步呢!?就是再开启一个主线程来用countDown()方法;
* 来进行减数,减到0就可以进行下一步程序
*/
cdOrder.await(); System.out.println("线程 "+ Thread.currentThread().getName()+"已接受命令!");
Thread.sleep((long)Math.random()*10000);
System.out.println("线程 "+ Thread.currentThread().getName()+"回应命令处理结果!"); //countDown();方法就是将计数器身上的计数减1
cdAnswer.countDown(); } catch (Exception e) {
e.printStackTrace();
}
}
};
service.execute(runnable);
}
try {
Thread.sleep((long)Math.random()*10000);
System.out.println("线程 "+ Thread.currentThread().getName()+"即将发布命令!"); cdOrder.countDown(); System.out.println("线程 "+ Thread.currentThread().getName()+"已发送命令,正在等待结果!"); cdOrder.await(); System.out.println("线程 "+ Thread.currentThread().getName()+"已收到所有响应结果!"); cdAnswer.countDown(); } catch (Exception e) {
e.printStackTrace();
}
service.shutdown();
} }
5. Exchanger工具类的使用案例
package com.java5.thread.newSkill; import java.util.concurrent.Exchanger;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors; /**
* Exchanger工具类的使用案例
* 应用场景:交易性应用或游戏
* 两个人碰在一起,交换彼此的数据
*/
public class ExchangerTest { public static void main(String[] args) { ExecutorService service = Executors.newCachedThreadPool();
final Exchanger exchanger = new Exchanger();
service.execute(new Runnable() { @Override
public void run() {
try{ String data1 = "杨凯";
System.out.println("线程 "+Thread.currentThread().getName()+" 正在把数据: "+data1+" 换出去!"); Thread.sleep((long)Math.random()*10000); String data2 = (String) exchanger.exchange(data1);
System.out.println("线程 "+Thread.currentThread().getName()+" 换回的数据为:"+data2);
}catch(Exception e){ }
}
});
service.execute(new Runnable() { @Override
public void run() {
try{ String data1 = "杨旋";
System.out.println("线程 "+Thread.currentThread().getName()+" 正在把数据: "+data1+" 换出去!"); Thread.sleep((long)Math.random()*10000); String data2 = (String) exchanger.exchange(data1);
System.out.println("线程 "+Thread.currentThread().getName()+" 换回的数据为:"+data2);
}catch(Exception e){ }
}
}); } }
线程高级应用-心得6-java5线程并发库中同步工具类(synchronizers),新知识大用途的更多相关文章
- 线程高级应用-心得8-java5线程并发库中同步集合Collections工具类的应用及案例分析
1. HashSet与HashMap的联系与区别? 区别:前者是单列后者是双列,就是hashmap有键有值,hashset只有键: 联系:HashSet的底层就是HashMap,可以参考HashSe ...
- Java中的线程--并发库中的集合
线程中的知识点基本都已经学完了,看看Java5并发库中提供的集合... 一.可堵塞队列 队列包含固定长度的队列和不固定长度的队列 ArrayBlockQueue中只有put()方法和take()方法才 ...
- java 利用同步工具类控制线程
前言 参考来源:<java并发编程实战> 同步工具类:根据工具类的自身状态来协调线程的控制流.通过同步工具类,来协调线程之间的行为. 可见性:在多线程环境下,当某个属性被其他线程修改后,其 ...
- Java核心知识点学习----线程同步工具类,CyclicBarrier学习
线程同步工具类,CyclicBarrier日常开发较少涉及,这里只举一个例子,以做备注.N个人一块出去玩,相约去两个地方,CyclicBarrier的主要作用是等待所有人都汇合了,才往下一站出发. 1 ...
- 《java并发编程实战》读书笔记4--基础构建模块,java中的同步容器类&并发容器类&同步工具类,消费者模式
上一章说道委托是创建线程安全类的一个最有效策略,只需让现有的线程安全的类管理所有的状态即可.那么这章便说的是怎么利用java平台类库的并发基础构建模块呢? 5.1 同步容器类 包括Vector和Has ...
- Java并发(基础知识)——显示锁和同步工具类
显示锁 Lock接口是Java ...
- 并发是个什么鬼之同步工具类CountDownLatch
扯淡 写这篇文章,我先酝酿一下,实不相瞒,脱离底层太久了,更确切的情况是,真没曾认真研究过.就目前来说,很多框架包括工具类已经把实现封装的很深,你只需轻轻的调用一下API,便不费半点力气.以至于大家会 ...
- 线程高级应用-心得5-java5线程并发库中Lock和Condition实现线程同步通讯
1.Lock相关知识介绍 好比我同时种了几块地的麦子,然后就等待收割.收割时,则是哪块先熟了,先收割哪块. 下面举一个面试题的例子来引出Lock缓存读写锁的案例,一个load()和get()方法返回值 ...
- 线程高级应用-心得4-java5线程并发库介绍,及新技术案例分析
1. java5线程并发库新知识介绍 2.线程并发库案例分析 package com.itcast.family; import java.util.concurrent.ExecutorServi ...
随机推荐
- 理解css中的position-static\relative\fixed\absolute
position属性有四个值: static(静态定位):是默认值,不会被特殊的定位,遵循正常的文档流对象,对象占用文档空间,该方式下,top.right.bottom.left.z-index等属性 ...
- ACM学习之路————一个大整数与一个小整数不得不说得的秘密
这个相对于两个大整数的运算来说,只能说是,low爆了. 只要利用好除法的性质,这类题便迎刃而解.O(∩_∩)O哈哈~ //大整数除一个int数 #include<iostream> #in ...
- 上传文件时,Request报文头不同浏览器会产生不同的content-type
选择一个zip文件上传,用IE看的报文头是image/jpeg,用chrom看是application/octet-stream. 第一次遇到这个类型的content-type,百度了一下, octe ...
- USB wifi调试笔记
本文以realtek 8192CU WiFi模块为例,介绍USB wifi在Jelly Bean 4.1的调试笔记. 1.WIFI打不开现象概述 WiFi打不开是指您在UI的settings下选中Wi ...
- Counting Rectangles
Counting Rectangles Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 1043 Accepted: 546 De ...
- C#字符串题目
老师给小学生门布置了一些作业,让它们按照一个模版写一些字符串交上来,同学们把作业交上来了,问题来了,这么多的作业老师批改不过来,现在请你帮老师写一个程序,帮助老师确定各个字符串是否合格.首先老师有一个 ...
- C#实现中国天气网XML接口测试
点击链接查看中国天气网接口说明,最近想研究一下接口测试,源于最近一次和某公司的技术总监(交大校友)谈话,发现接口测试的需求是比较大的,于是想要研究一下. 好不容易在网上找到了一个关于中国天气网的接口说 ...
- maven之一——多模块项目构建
参考这个帖子: http://www.cnblogs.com/xdp-gacl/p/4242221.html
- C语言第2天基本运算
getchar 一.首先给出<The_C_Programming_Language>这本书中的例子: #include <stdio.h> int main( ) { ...
- nginx 网站目录重写
rewrite ^/en/ /en.php last;rewrite ^/en /en.php last;