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
- 搭建Visual Studio Code+Python开发环境1.对象简介2. 搭建步骤3.小结
- 洛谷P3835 【模板】可持久化平衡树
- 17.HTML
- 洛谷P2925 [USACO08DEC]干草出售Hay For Sale
- Numpy 修炼之道 (13)—— 将python函数向量化
- 洛谷P1887 乘积最大3
- 18.CSS
- R语言可视化——ggplot图表系统中的形状
- [机器学习Lesson 1 Introduction] 机器学习的动机与应用
- 洛谷P3377 【模板】左偏树(可并堆)
- Numpy 修炼之道 (12)—— genfromtxt函数
- 19.JavaScript
- 20.DOM
- 洛谷P3273 [SCOI2011]棘手的操作
- 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 文档注释
- linux中把.c的文件编译成.so文件
- Ubuntu16.04 中 locate文件查找命令
- Ubuntu 16.04与Apache虚拟主机配置的步骤详解
- Linux删除目录下的文件的10种方法小结
- 利用Linux防火墙隔离本地欺骗地址的方法详解
- 视图在SQL中的作用是什么,它是怎样工作的?
- Linux命令行上如何使用日历详解
- 在Linux下修改和重置root密码的方法(超简单)
- 在Centos上搭建Maven中央仓库的方法
- 详解Ubuntu16.04启动器图标异常解决方法
- Linux(ubuntu)下实现增加/删除文件权限
- Vim中文件编码处理与重新打开乱码文件详解
- Linux常用命令mkdir详解
- CentOS6.5环境下使用rsync增量同步备份文件的方法
- Linux 搭建Git服务器的方法