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),新知识大用途的更多相关文章

  1. 线程高级应用-心得8-java5线程并发库中同步集合Collections工具类的应用及案例分析

    1.  HashSet与HashMap的联系与区别? 区别:前者是单列后者是双列,就是hashmap有键有值,hashset只有键: 联系:HashSet的底层就是HashMap,可以参考HashSe ...

  2. Java中的线程--并发库中的集合

    线程中的知识点基本都已经学完了,看看Java5并发库中提供的集合... 一.可堵塞队列 队列包含固定长度的队列和不固定长度的队列 ArrayBlockQueue中只有put()方法和take()方法才 ...

  3. java 利用同步工具类控制线程

    前言 参考来源:<java并发编程实战> 同步工具类:根据工具类的自身状态来协调线程的控制流.通过同步工具类,来协调线程之间的行为. 可见性:在多线程环境下,当某个属性被其他线程修改后,其 ...

  4. Java核心知识点学习----线程同步工具类,CyclicBarrier学习

    线程同步工具类,CyclicBarrier日常开发较少涉及,这里只举一个例子,以做备注.N个人一块出去玩,相约去两个地方,CyclicBarrier的主要作用是等待所有人都汇合了,才往下一站出发. 1 ...

  5. 《java并发编程实战》读书笔记4--基础构建模块,java中的同步容器类&并发容器类&同步工具类,消费者模式

    上一章说道委托是创建线程安全类的一个最有效策略,只需让现有的线程安全的类管理所有的状态即可.那么这章便说的是怎么利用java平台类库的并发基础构建模块呢? 5.1 同步容器类 包括Vector和Has ...

  6. Java并发(基础知识)——显示锁和同步工具类

    显示锁                                                                                     Lock接口是Java ...

  7. 并发是个什么鬼之同步工具类CountDownLatch

    扯淡 写这篇文章,我先酝酿一下,实不相瞒,脱离底层太久了,更确切的情况是,真没曾认真研究过.就目前来说,很多框架包括工具类已经把实现封装的很深,你只需轻轻的调用一下API,便不费半点力气.以至于大家会 ...

  8. 线程高级应用-心得5-java5线程并发库中Lock和Condition实现线程同步通讯

    1.Lock相关知识介绍 好比我同时种了几块地的麦子,然后就等待收割.收割时,则是哪块先熟了,先收割哪块. 下面举一个面试题的例子来引出Lock缓存读写锁的案例,一个load()和get()方法返回值 ...

  9. 线程高级应用-心得4-java5线程并发库介绍,及新技术案例分析

    1.  java5线程并发库新知识介绍 2.线程并发库案例分析 package com.itcast.family; import java.util.concurrent.ExecutorServi ...

随机推荐

  1. java 面试每日一题4

    题目:有1.2.3.4个数字,能组成多少个互不相同且无重复数字的三位数?都是多少?  1.程序分析:可填在百位.十位.个位的数字都是1.2.3.4.组成所有的排列后再去 掉不满足条件的排列. publ ...

  2. python8

    编译和解释性语言的区别 编译 典型的C C++ 编译完成之后是可执行文件. 机器码-底层(外文书,但是不懂中文,翻译成中文就可以看) 解释性语言----看一句英文书,让翻译解释一句 解释器写的代码便于 ...

  3. EF查询分页

    static List<T> GetPageList(Func<T,bool> whereLambda,Func<T,object> orderLambda,int ...

  4. ZOJ 3860: - Find the Spy

    3860 - Find the Spy Time Limit:2000MS     Memory Limit:65536KB     64bit IO Format:%lld & %llu S ...

  5. Uva 1626,括号序列

    题目链接:https://uva.onlinejudge.org/external/16/1626.pdf 题意: 给定一个字符串,看是否括号匹配,不匹配加括号,加最少的括号使得匹配.输出该结果. 分 ...

  6. [Python]如何使用HtmlTestRunner让自动化测试报告内容更丰富

    简述 使用selenium webdriver + Python做自动化测试,执行完成后要生成测试报告,Python我们使用的HTMLtestrunner 进行生成,但是默认提供的生成报告内容,并不能 ...

  7. Linux 常见的trouble shooting故障排错

    Linux 常见的trouble shooting故障排错 备份开机所必须运行的程序对一个运维人员来说是非常有必要的.在实际生产环境中,系统和数据基本都是安装在不同的硬盘上面,因为企业最关心的还是数据 ...

  8. Struts2的标签库(三)——控制标签

    Struts2的标签库(三) --控制标签 1.if/elseif/else标签 用于分支控制,取代JSP中的if语句,根据一个boolean(test属性的值)值判断是否进行下一步运算或者输出等. ...

  9. 【转载】C++知识库内容精选 尽览所有核心技术点

    原文:C++知识库内容精选 尽览所有核心技术点 C++知识库全新发布. 该知识库由C++领域专家.CSDN知名博客专家.资深程序员和项目经理安晓辉(@foruok)绘制C++知识图谱,@wangshu ...

  10. js之字面量、对象字面量的访问、关键字in的用法

    一:字面量含义 字面量表示如何表达这个值,一般除去表达式,给变量赋值时,等号右边都可以认为是字面量. 字面量分为字符串字面量(string literal ).数组字面量(array literal) ...