并发编程5-同步器

Synchronizer

控制多个线程的流程,比如线程执行到某一个点的时候是等待还是通过。 JDK中自带了信号量,关卡,闭锁

闭锁CoutDownLatch

达到最终状态前是关闭的,所有线程在此阻塞,  达到最终状态后开放,并且不可以再修改,所有线程进入可运行状态。
很适合,等待初始化, 等待依赖等等场景。
如:
/*** 设置countDownLatch的初始值,* 用await()来等待* 用countDown来倒计时 --初始值* 当初始值为0时await()等待被notify*/
public class TestLatch {public static void main(String[] args) {final CountDownLatch latch = new CountDownLatch(1);final String[] datas = new String[3];new Thread(){@Overridepublic void run() {try {System.out.println("等待初始化");latch.await();} catch (InterruptedException e) {e.printStackTrace();}System.out.println("初始化完成。开始执行");for (String data : datas) {System.out.println(data);}}}.start();try {TimeUnit.SECONDS.sleep(1);} catch (InterruptedException e) {e.printStackTrace();}datas[0] = "我";datas[1] = "爱";datas[2] = "你";System.out.println("初始化完成");latch.countDown();}
}

信号量 

适用于连接池等场景
/*** 创建一个含有固定许可数的信号量* 线程用acquire()标记获得了一个许可,切许可-1,当许可为0时等待,* 用release来释放许可,许可+1,其他等待的线程可以获得许可了。*/
public class TestSemaphore {public static void main(String[] args) {final Semaphore semaphore = new Semaphore(5);for (int i = 0; i < 20; i++) {new Thread("thread" + i){@Overridepublic void run() {try {semaphore.acquire();} catch (InterruptedException e) {e.printStackTrace();}System.out.println(getName() + "正在执行");try {TimeUnit.SECONDS.sleep(1);} catch (InterruptedException e) {e.printStackTrace();}semaphore.release();;}}.start();}}
}

关卡

与闭锁不同的是,闭锁等待状态,而关卡是等待线程。
特别适用于把一个计算拆分成多个进行计算,最后再进行整合。
/*** 关卡* 定义所有线程都到关卡之后的行为及关卡中包含的线程数量** 各个线程使用await方法来表示已经到这个关卡等着了** 当指定数目的线程等着了,那么就开放关卡, 所有线程及刚才定义的行为都继续执行*/
public class TestBarrier {public static void main(String[] args) {final String[] friends = new String[]{"1", "2", "3"};final CyclicBarrier cyclicBarrier = new CyclicBarrier(3, new Runnable() {@Overridepublic void run() {System.out.println("出发");}});for (final String friend : friends) {new Thread(){@Overridepublic void run() {System.out.println(friend + "到集合点了");try {cyclicBarrier.await();} catch (InterruptedException e) {e.printStackTrace();} catch (BrokenBarrierException e) {e.printStackTrace();}System.out.println(friend + "出发");}}.start();}}
}

打印如下:
1到集合点了
3到集合点了
2到集合点了
出发
2出发
3出发
1出发

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/263846.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

RE validation in Java EE

pattern 对象是一个正则表达式的编译表示。Pattern 类没有公共构造方法。要创建一个 Pattern 对象&#xff0c;你必须首先调用其公共静态编译方法&#xff0c;它返回一个 Pattern 对象。该方法接受一个正则表达式作为它的第一个参数。 Pattern类中有两个最常用的方法&#xff1…

Apache Rewrite 规则详解

1、Rewrite规则简介&#xff1a; Rewirte主要的功能就是实现URL的跳转&#xff0c;它的正则表达式是基于Perl语言。可基于服务器级的(httpd.conf)和目录级的(.htaccess) 两种方式。如果要想用到rewrite模块&#xff0c;必须先安装或加载rewrite模块。方法有两种一种是编译apach…

php源码编程,10个小技巧让你做好php源码编程

PHP是目前使用最广泛的网站编程语言&#xff0c;也是今后发展的一大趋势。有很多站长或多或少掌握一些php编程方法&#xff0c;下面小编就介绍十点实用的php编码技巧。1、cho比print 快&#xff0c;并且使用echo的多重参数(译注&#xff1a;指用逗号而不是句点)代替字符串连接&…

iPhone与Android手机 各个型号的UserAgent

微信端模拟&#xff1a;Mozilla/5.0 (Linux; U; Android 4.1.2; zh-cn; GT-I9300 Build/JZO54K) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Mobile Safari/534.30 MicroMessenger/5.2.380■iPhone●iOSMozilla/5.0 (iPhone; U; CPU like Mac OS X; en) AppleWebKit/…

动态调用WCF服务[转]

原文地址&#xff1a;http://blog.csdn.net/castlooo/archive/2010/05/06/5562619.aspx客户端调用wcf &#xff0c;有时需要动态的调用服务端的WCF中的方法&#xff0c;本方法&#xff0c;反射wcf 的接口&#xff0c;动态调用接口中的方法。 主要为&#xff0c;动态绑定&#x…

java 正规 忽略,java-正则表达式查找变量并忽略方法

我正在尝试编写一个正则表达式,以查找给定一段JavaScript代码中的所有变量(并且只有变量,完全忽略方法).实际的代码(执行regex的代码)是用Java编写的.现在,我有这样的事情&#xff1a;Matcher matcherPattern.compile(".*?([a-z]\w*?).*?").matcher(string);while…

【吐槽】博客园新的原创文章在搜索引擎的排名不及转载的站点

最近写博客比较多&#xff0c;但发现文章被一些网站转载后&#xff0c;排名比博客园的链接还要高&#xff0c;有些搜索引擎甚至连博客园的链接都没有&#xff0c;坑爹&#xff0c;坑爹。。。 以前博客园的网友也遇到过类似的情况&#xff0c;也分享过一些防转载的经验&#xff…

Qt之程序发布以及打包成exe安装包

一、简述 Qt项目开发完成之后&#xff0c;需要打包发布程序&#xff0c;而因为用户电脑上没有Qt配置环境&#xff0c;所以需要将release生成的exe文件和所依赖的dll文件复制到一个文件夹中&#xff0c;然后再用 Inno Setup打包工具 打包成一个exe安装包&#xff0c;就可以发布了…

把ASP应用中的Session传递给asp.net应用

ASP.NET APPLICATION要使用原来的ASP用户系统&#xff0c;于是问题出现了&#xff0c;ASP APPLICATION怎样才能让用户登录的状态及用户信息在ASP.NET中依然有效呢。于是我们考虑用构造FORM来自动提交传递ASP应用中的Session变量。例子如下ASP应用URL为http://127.0.0.1/asp/&am…

linux下生成key

linux下生成key 使用public/private key让putty(ssh)自动登录&#xff08;以及linux上使用密钥做ssh自动登陆&#xff09; 方法一&#xff1a;使用puttygen.exe 第一步&#xff1a;生成密匙 运行puttygen.exe&#xff0c;选择需要的密匙类型和长度&#xff0c;使用默认的SSH2(R…

php获取字符串扩展,PHP7扩展开发之字符串处理

标签&#xff1a;本文和大家分享的主要是PHP7扩展开发中字符串的处理相关知识&#xff0c;希望通过本文的分享能帮助大家更好的学习php。这次&#xff0c;我们来看看字符串在PHP扩展里面如何处理。示例代码如下&#xff1a;$len strlen($prefix);$substr substr($string, 0, …

使用Nginx+WordPress搭建个人网站

背景 很多研究技术的朋友喜欢写博客。如果希望搭建一个完全属于自己的网站&#xff0c;也并不困难。这里简要分享一下我搭建这个博客网站的经验。 关键步骤 购买服务器、域名、DNS云解析服务网站备案&#xff08;可选&#xff09;安装NginxWordPressMySQLPHP配置WordPress运行网…

UNION ALL returning wrong results?

有应用人员反映某套Linux上的11.2.0.1数据库系统中出现了UNION ALL后返回的结果集不正确的问题,我们具体分析下出现问题的其中一条语句: SELECT MTL_SECONDARY_INVENTORIES.SECONDARY_INVENTORY_NAME,MTL_SECONDARY_INVENTORIES.ORGANIZATION_ID,MTL_SECONDARY_INVENTORIES.DES…

android jni java类型与c语言类型互换

1.java String转换 C str char* Jstring2CStr(JNIEnv* env, jstring jstr) {char* rtn NULL;jclass clsstring (*env)->FindClass(env,"java/lang/String");jstring strencode (*env)->NewStringUTF(env,"GB2312");jme…

zip:命令行下zip压缩/解压缩

在Ubuntu 18.04下验证&#xff0c;造冰箱的大熊猫cnblogs 2019/6/6 1压缩单个文件zip package.zip file2压缩多个文件zip package.zip file1 file23压缩单个文件夹zip -r package.zip folder4压缩多个文件夹zip -r package.zip folder1 folder25压缩文件、文件夹zip -r package…

inv(a) matlab,在MATLAB中,inv(A)表示的是()

在MATLAB中&#xff0c;inv(A)表示的是()答&#xff1a;矩阵A的逆下列不属于植物生长调节剂的是( )。答&#xff1a;DDTHe received four years of training in English and two years in English teaching.He is a _______ English instructor.答&#xff1a;qualified第五章&…

TSQL与PL/SQL的比较

TSQL与PL/SQL的比较 以前一直用mssql 做开发&#xff0c;最近的项目都Oracle, 1)数据类型 TSQL PL/SQL numeric(p,s) numeric(p,s) or NUMBER(p,s) decimal(p,s) decimal(p,s) or NUMBER(p,s) char(m) Char(m) varchar(m) varchar2(m) datetime date…

前端文件表单/ajax上传实例代码

表单上传文件 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>测试文件上传</title> </head> <body> <form action"/attach/upload" enctype"multipart/form-dat…

matlab2012生成dll,64位win7下vc2010如何调用matlab2012a中生成的dll文件

本文说是原创&#xff0c;但核心部分是参考http://blog.sina.com.cn/s/blog_a5fdbf0101018n91.html(大家可以先看看这篇文章)&#xff0c;在此再次感谢debug童鞋。debug童鞋的系统是 win7 32位 vc2010 (32位编译器) Matlab2012a &#xff0c;如果童鞋们win7是32位的话就不必…

CentOS/Linux 卸载MATLAB

rm -rf /usr/local/MATLAB/R2012arm /usr/local/bin/matlab /usr/local/bin/mcc /usr/local/bin/mex /usr/local/bin/mbuild