线程高级应用-心得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 ...
随机推荐
- 让popUpWindow之外的区域显示阴影效果
/** * 让popupwindow以外区域阴影显示 * @param popupWindow */ private void popOutShadow(PopupWindow popupWindow ...
- AngularJS 用 Interceptors 来统一处理 HTTP 请求和响应
Web 开发中,除了数据操作之外,最频繁的就是发起和处理各种 HTTP 请求了,加上 HTTP 请求又是异步的,如果在每个请求中来单独捕获各种常规错误,处理各类自定义错误,那将会有大量的功能类似的代码 ...
- 【转】Tomcat中部署java web应用程序
http://www.blogjava.net/jiafang83/archive/2009/06/02/279644.html 转载:今天给大家介绍怎样在Tomcat5.5.9中部署Java Web ...
- Multi-Perspective Sentence Similarity Modeling论文demo实现
由于下载glove时,下载脚本并未自己执行txt文件转.th文件,在执行th trainSIC.lua时报错 需要根据fetch_and_preprocess.sh中的代码利用scripts中的con ...
- hdu 2089 不要62 数位dp
不要62 Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submis ...
- AIM Tech Round 3 (Div. 2) A
Description Kolya is going to make fresh orange juice. He has n oranges of sizes a1, a2, ..., an. Ko ...
- ASP函数大全
ASP函数大全 Array() FUNCTION: 返回一个数组 SYNTAX: Array(list) ARGUMENTS: 字符,数字均可 EXAMPLE: <% Dim myArray() ...
- easyui.combotree.search.js
(function ($) { //combotree可编辑,自定义模糊查询 $.fn.combotree.defaults.editable = true; $.extend($.fn.combot ...
- mvcAPI (入门 3)
续上 1)无参数Get请求 <!DOCTYPE html> <html xmlns="http://www.w3.org/1999/xhtml"> < ...
- EF 存储过程
今天我们利用EF执行sql语句的方式来执行存储过程,并得到OutPut的值. 首先新建存储过程: Create PROCEDURE proc_testEF ( @id int, @ ...