Java并发之Condition 并发同步控制
时间:2022-07-24
本文章向大家介绍Java并发之Condition 并发同步控制,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
1 package com.thread.test.thread;
2
3 import java.util.PriorityQueue;
4 import java.util.concurrent.locks.Condition;
5 import java.util.concurrent.locks.Lock;
6 import java.util.concurrent.locks.ReentrantLock;
7
8 /**
9 * Created by windwant on 2016/10/21.
10 */
11 public class MyLockCondition{
12
13 private int queueSize = 10;
14 private PriorityQueue<Integer> queue = new PriorityQueue<Integer>(queueSize);
15 private Lock lock = new ReentrantLock();
16 private Condition notFull = lock.newCondition();
17 private Condition notEmpty = lock.newCondition();
18
19 public static void main(String[] args) {
20 MyLockCondition test = new MyLockCondition();
21 Producer producer = test.new Producer();
22 Consumer consumer = test.new Consumer();
23
24 producer.start();
25 consumer.start();
26 }
27
28 class Consumer extends Thread{
29
30 @Override
31 public void run() {
32 consume();
33 }
34
35 private void consume() {
36 while(true){
37 lock.lock();
38 try {
39 while(queue.size() == 0){
40 try {
41 System.out.println("队列空,等待数据");
42 notEmpty.await();
43 } catch (InterruptedException e) {
44 e.printStackTrace();
45 }
46 }
47 queue.poll(); //每次移走队首元素
48 notFull.signal();
49 System.out.println("从队列取走一个元素,队列剩余"+queue.size()+"个元素");
50 } finally{
51 lock.unlock();
52 }
53 }
54 }
55 }
56
57 class Producer extends Thread{
58
59 @Override
60 public void run() {
61 produce();
62 }
63
64 private void produce() {
65 while(true){
66 lock.lock();
67 try {
68 while(queue.size() == queueSize){
69 try {
70 System.out.println("队列满,等待有空余空间");
71 notFull.await();
72 } catch (InterruptedException e) {
73 e.printStackTrace();
74 }
75 }
76 queue.offer(1); //每次插入一个元素
77 notEmpty.signal();
78 System.out.println("向队列取中插入一个元素,队列剩余空间:"+(queueSize-queue.size()));
79 } finally{
80 lock.unlock();
81 }
82 }
83 }
84 }
85 }
项目地址:https://github.com/windwant/windwant-demo/tree/master/thread-demo
- Java8-初识Lambda
- 我的WCF之旅(5):面向服务架构(SOA)和面向对象编程(OOP)的结合——如何实现Service Contract的重载(Overloading)
- WCF技术剖析之三十:一个很有用的WCF调用编程技巧[下篇]
- 谈谈WCF中的Data Contract(3):WCF Data Contract对Collection & Dictionary的支持
- WCF技术剖析之二十九:换种不同的方式调用WCF服务[提供源代码下载]
- 我的WCF之旅(4):WCF中的序列化[下篇]
- [WCF权限控制]模拟(Impersonation)与委托(Delegation)[上篇]
- Android EclipseIDE技巧
- 什么是编译错误,运行时错误及逻辑错误?
- 我的WCF之旅(4):WCF中的序列化[上篇]
- WCF技术剖析之二十八:自己动手获取元数据[附源代码下载]
- 微信年度重磅“小游戏”上线,罗胖一度退出的小程序正在逆袭
- 谈谈WCF中的Data Contract(2):WCF Data Contract对Generic的支持
- Android注解学习(1)
- java教程
- Java快速入门
- Java 开发环境配置
- Java基本语法
- Java 对象和类
- Java 基本数据类型
- Java 变量类型
- Java 修饰符
- Java 运算符
- Java 循环结构
- Java 分支结构
- Java Number类
- Java Character类
- Java String类
- Java StringBuffer和StringBuilder类
- Java 数组
- Java 日期时间
- Java 正则表达式
- Java 方法
- Java 流(Stream)、文件(File)和IO
- Java 异常处理
- Java 继承
- Java 重写(Override)与重载(Overload)
- Java 多态
- Java 抽象类
- Java 封装
- Java 接口
- Java 包(package)
- Java 数据结构
- Java 集合框架
- Java 泛型
- Java 序列化
- Java 网络编程
- Java 发送邮件
- Java 多线程编程
- Java Applet基础
- Java 文档注释
- js中class的继承的基础用法
- JavaScript 设计模式学习总结与感悟(开发&面试必备)
- 3分钟短文 | PHP多维数组搜索值,就只能for循环?这样写更高效
- 如何获得tomcat管理员账号
- ant target间的dependency
- 如何用ant将JSP项目打成war包
- 3分钟短文 | MySQL备份和迁移sql文件,这个指令基础又关键
- 如何用ant给Java项目生成文档
- ant build里如何指定classpath
- Tomcat服务器java.lang.IllegalArgumentException异常
- 动态控制SAP CRM附件的可编辑性
- 关于node.js:ExpressJS、Websocket中的session会话共享
- 【STM32F429开发板用户手册】第23章 STM32F429的USART串口基础知识和HAL库API
- 【STM32F407开发板用户手册】第23章 STM32F407的USART串口基础知识和HAL库API
- 小姐姐提灯给你讲讲动态规划(万字长文)