java线程同步的实现_【Java多线程系列三】实现线程同步的方法

packagecom.concurrent.test;importjava.util.Stack;importjava.util.concurrent.ArrayBlockingQueue;importjava.util.concurrent.BlockingQueue;importjava.util.concurrent.locks.Condition;importjava.util.concurrent.locks.ReentrantLock;/*** @Description: 三种方法实现生产者/消费者*/

public classThreadSynchronizeTest {public static voidmain(String[] args) {

ProducerConsumer producerConsumer= newProducerConsumerViaBlockingQueue();

producerConsumer.test();

}

}abstract classProducerConsumer {protected int capacity = 10;protected int element = 0;protected abstract void produce() throwsInterruptedException;protected abstract void consume() throwsInterruptedException;public voidtest() {

Thread producer= new Thread(newRunnable() {

@Overridepublic voidrun() {while (true) {try{

produce();

}catch(InterruptedException e) {

e.printStackTrace();

}

}

}

});

Thread consumer= new Thread(newRunnable() {

@Overridepublic voidrun() {while (true) {try{

consume();

}catch(InterruptedException e) {

e.printStackTrace();

}

}

}

});

producer.start();

consumer.start();

}

}/*** 方法一:ReentrantLock结合Condition*/

class ProducerConsumerViaReentrantLock extendsProducerConsumer {private Stack stack = new Stack<>();private ReentrantLock lock = newReentrantLock();private Condition notFull =lock.newCondition();private Condition notEmpty =lock.newCondition();

@Overrideprotected void produce() throwsInterruptedException {try{

lock.lock();if (stack.size() ==capacity) {

notFull.await();

}++element;

System.out.println(Thread.currentThread().getId()+ "," + Thread.currentThread().getName() + " produce " +element);

stack.push(element);

notEmpty.signalAll();

Thread.sleep(1000L);

}finally{

lock.unlock();

}

}

@Overrideprotected void consume() throwsInterruptedException {try{

lock.lock();if(stack.isEmpty()) {

notEmpty.await();

}int element =stack.pop();

System.out.println(Thread.currentThread().getId()+ "," + Thread.currentThread().getName() + " consume " +element);

notFull.signalAll();

}finally{

lock.unlock();

}

}

}/*** 方法二:synchronized 结合 wait、notify、notifyAll*/

class ProducerConsumerViaObjectLock extendsProducerConsumer {private Stack stack = new Stack<>();private Object lock = newObject();

@Overrideprotected void produce() throwsInterruptedException {/** 1,lock为监视器

* 2,wait/notify/notifyAll方法必须在synchronized块内调用

* 3,调用wait/notify/notifyAll方法但不持有监视器的使用权将会抛出java.lang.IllegalMonitorStateException*/

synchronized(lock) {if (stack.size() ==capacity) {

lock.wait();

}++element;

System.out.println(Thread.currentThread().getId()+ "," + Thread.currentThread().getName() + " produce " +element);

stack.push(element);

lock.notifyAll();

Thread.sleep(1000L);

}

}

@Overrideprotected void consume() throwsInterruptedException {synchronized(lock) {if(stack.isEmpty()) {

lock.wait();

}int element =stack.pop();

System.out.println(Thread.currentThread().getId()+ "," + Thread.currentThread().getName() + " consume " +element);

lock.notifyAll();

}

}

}/*** 方法三:BlockingQueue*/

class ProducerConsumerViaBlockingQueue extendsProducerConsumer {private BlockingQueue queue = new ArrayBlockingQueue<>(capacity);

@Overrideprotected void produce() throwsInterruptedException {++element;

System.out.println(Thread.currentThread().getId()+ "," + Thread.currentThread().getName() + " produce " +element);

queue.put(element);

Thread.sleep(1000L);

}

@Overrideprotected void consume() throwsInterruptedException {int element =queue.take();

System.out.println(Thread.currentThread().getId()+ " consume " +element);

Thread.sleep(10000L);

}

}

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

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

相关文章

python建立py文件夹过程_Pycharm创建python文件自动添加日期作者等信息(步骤详解)...

百度AI接口的调用方法不必多介绍。官网地址 人流量统计新建AipBodyAnalysisfrom aip import AipBodyAnalysis""" 你的 APPID AK SK """APP_ID 你的 App IDAPI_KEY 你2021-02-03 14:24:01本文主要介绍了在python3.9下如何安装scrapy的方法&…

python父亲节祝福_父亲节祝福语精选简短 父亲节祝福语简短独特

1.您的坚忍不拔和铮铮硬骨是我的榜样&#xff0c;我从您那儿汲取到奋发的力量&#xff0c;走过挫折&#xff0c;迈向成功&#xff0c;爸爸&#xff0c;您是我永远的榜样&#xff0c;我爱您&#xff01;祝您节日快乐&#xff01;2.您的怀抱&#xff0c;是我的小天地&#xff1b;…

redis java应用_redis在JAVA的简单应用

reids是一个高性能的key-value数据库。它存储的value支持各种类型的数据&#xff0c;如String,List&#xff0c;set&#xff0c;hash类型。在此基础上&#xff0c;各种不同方式的排序。本文不具体争对redis数据库的各种命令&#xff0c;而是在Java实现简单的调用。1. //初始化R…

java安装 hello_安装JAVA步骤,并编写HELLOWORLD程序

安装Java步骤&#xff0c;并编写helloworld程序1.安装JDK(Java Development Kit)JDK是Java开发工具包(Java Development Kit)的缩写。它是一种用于构建在J Java 平台上发布的应用程序、applet和组件的开发环境。即编写Java程序必须有JDK&#xff0c;它提供了编译Java和运行Java…

java实现Fmeasure计算_聚类结果的评估指标及其JAVA实现

一. 前言又GET了一项技能。在做聚类算法的时候&#xff0c;由于要评估所提出的聚类算法的好坏&#xff0c;于是需要与一些已知的算法对比&#xff0c;或者用一些人工标注的标签来比较&#xff0c;于是用到了聚类结果的评估指标。我了解了以下几项。TP:是指被聚在一类的两个量被…

java随机产生坐标点_刚学JAVA不久,问一下怎么把这个程序实现随机啊,不是按照坐标...

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼int i;int z0;int j,h0,k0;int AppletWidch,AppletHeight,currentImage;Image Animation[],SerialImage,OffScreen;Thread newThread;Graphics drawOffScreen;MediaTracker MT;ImageProducer Source;CropImageFilter CutImage;publ…

ubuntu安装java的rpm_ubuntu安装jdk-6u45-linux-x64-rpm.bin

1、参考网址&#xff1a;ZC: 网页内容保存于 “百度云 CodeSkill33 --> 全部文件 >来自网页 > Linux > ubuntu > ubuntu安装jdk-6u45-linux-x64-rpm.bin__Work_20160115_0851.rar”2、(1)、我是将jdk-6u45-linux-x64.bin放在 "/home"下的(2)、命令&qu…

java窗体容器坐标_Java的屏幕坐标是以像素为单位的,容器的左下角被确定为坐标的起点。...

屏单位的的左定为的起点Despite ________ difficulties, they did not find the life in London unpleasant.幕坐As soon as I was ____________, I began to have second thoughts about leaving.标被确The girl was uncertain what to do, or what tone of voice to_________…

mysql 相同字段相减_mysql datetime 类型字段相减

背景&#xff1a;今天测试一个mariadb中datatime类型的字段相减问题&#xff0c;直接用2个字段相减得到的数值并不是秒&#xff0c;很坑。后面百度了一些方法&#xff0c;说是使用 DateDiff 函数&#xff0c;这个函数文档还说有3个参数&#xff0c;但是3个参数运行是报错的。要…

java类 连接时机_java类的加载时机

类加载它直接表现出来的代码应该是 ClassLoader.getSystemClassLoader().loadClass("com.my.test.AbcClass")。所以具 体完成类的加载工作的&#xff0c;是常被提到的类加载器ClassLoader&#xff0c;它就是专门干这件事的。“类的加载”具体而言就是指将类.class文件…

Java最短路径类型_JAVA 最短路径

1.从景石出发&#xff0c;步行游览以下景点:①游客服务中心&#xff0c;②阳光草坪&#xff0c;③森林小剧场&#xff0c;④儿童科普体验区&#xff0c;⑤儿童戏水场&#xff0c;⑥湿地博物馆&#xff0c;⑦湿地商业街。建立数学模型&#xff0c;找出从景石出发&#xff0c;到达…

java 外螺旋矩阵_螺旋矩阵的java实现

今天参加了腾讯实习生的在线笔试&#xff0c;螺旋矩阵的问题&#xff0c;算是ACM的入门题吧想到了有两种实现递归和非递归输入&#xff1a;3输出&#xff1a;1 2 3 8 9 4 7 6 5输入&#xff1a;5输出&#xff1a;1 2 3 4 516 17 18 19 615 24 25 20 714 23 22 21 8…

1445.32php,nginx实现mysql的负载均衡

1.下载module模块$ tar -xzvf nginx-1.2.1.tar.gz$ cd nginx-1.2.1/$ patch -p1 < /path/to/nginx_tcp_proxy_module/tcp.patch /path是指nginx_tcp_proxy_module路径$ ./configure --add-module/usr/local/ngx_cache_purge-1.4--prefix/usr/local/nginx --with-http_stub…

php date 有warning,php提示PHP Warning: date(): It is not safe to rely on the......错误的解决办法...

在写php程序中有时会出现这样的警告&#xff1a;PHP Warning: date(): It is not safe to rely on the systems timezone settings. You are *required* to use the date.timezone setting or the date_default_timezone_set() function. In case you used any of those method…

php不用于输出的函数,PHP常用函数和常见疑难问题解答

首先介绍下比较简单但必不可少且实用的知识&#xff0c;可以当手册查询&#xff0c;适合像我一样的新手看。PHP常用库函数介绍一、PHP字符串操作常用函数1.确定字符串长度int strlen(string str)2.比较两个字符串a. strcmp函数对两个字符串进行二进制安全的比较&#xff0c;并区…

php指定字符编码,PHP字符编码问题

绝对一劳永逸,确保您再也不会遇到编码问题&#xff1a;在任何地方使用UTF-8&#xff01;那是(如果你使用mysql和php)&#xff1a;>例如,将数据库中的所有表格设置为整理“utf8_general_ci”.>建立数据库连接后,运行以下SQL查询&#xff1a;“SET NAMES’utf8’”>始终…

php 开启,PHP服务的开启详细步骤

安装完php,使用chkconfig命令来查看php-fpm服务是否开启&#xff0c;如果没有开启1. 在/etc/init.d/目录下创建脚本php-fpmvim/etc/init.d/php-fpm2. 编写脚本内容(将一下复制进去相应改动安装路径)#!/bin/sh## php-fpm - this script starts and stops the php-fpm daemin## c…

php ssh 管理服务器,php 利用ssh执行远程或本地liunx服务器命令

/*** 利用ssh执行 远程或本地liunx服务器命令* 虽然可以用 shee_exec来执行本地机命令 但却无法选择用哪个用户来执行 此函数可解决此类问题* $host ssh 主机名 可以为ip 或 域名* $port ssh 端口* $ssh_username ssh 登录用户名* $ssh_password ssh 登录密码* $command 要执行…

php四种标量,php的标量数据类型和复合数据类型,php四种标量

php的标量数据类型和复合数据类型PHP的标量数据类型和复合数据类型&#xff0c;标量数据类型数值类型整型$ a20浮点型(小数)$ a1.2布尔类型$ atrueecho $ a//输出1 $ bfalseecho $ b//输出0字符串类型//单引号$ str’ Hello world//双引号$ str’ Hello World//转义符\ ‘ $ st…

用java创建一个单例模式,采用Java实现单例模式

一. 背景单例模式是指在内存中只会创建且仅创建一次对象的设计模式。在程序中多次使用同一个对象且作用相同时&#xff0c;为了防止频繁地创建对象使得内存飙升&#xff0c;单例模式可以让程序仅在内存中创建一个对象&#xff0c;让所有需要调用的地方都共享这一单例对象。- 引…