Java 学习笔记 使用并发包ReentrantLock简化生产者消费者模式代码
说明
ReentrantLock是java官方的一个线程锁类,ReentarntLock实现了Lock的接口
我们只需要使用这个,就可以不用使用synchronized同步关键字以及对应的notifyall方法和wait方法去写我们的生产者消费者模式。
这样就可以大大简化我们的代码
代码
Producer.java
package producterandcustomer;
import java.util.List;
import java.util.concurrent.locks.Lock;
/**
* @author StarsOne
* @date Create in 2019-4-13 0013 14:51:21
* @description
*/
class Producter extends Thread {
List<Object> warehouse;
private String name;
Lock lock;
public Producter(List<Object> warehouse, String name, Lock lock) {
this.warehouse = warehouse;
this.name = "生产者" + name;
//多态,ReentarntLock实现了Lock的接口,所以可以传进来
this.lock = lock;
}
@Override
public void run() {
while (true) {
//加锁
lock.lock();
try {
if (warehouse.size() < 10) {
warehouse.add(new Object());
System.out.println(name + "生产1件" + "当前仓库有" + warehouse.size() + "件");
}
} finally {
//解锁
lock.unlock();
}
try {
sleep(200);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
Consumer.java
package producterandcustomer;
import java.util.List;
import java.util.concurrent.locks.Lock;
/**
* @author StarsOne
* @date Create in 2019-4-13 0013 14:51:21
* @description
*/
class Cuotmer extends Thread{
List<Object> warehouse;
private String name;
Lock lock;
public Cuotmer(List<Object> warehouse, String name, Lock lock) {
this.warehouse = warehouse;
this.name = "消费者"+name;
this.lock = lock;
}
@Override
public void run() {
while (true) {
//加锁
lock.lock();
try {
if (warehouse.size() > 0) {
warehouse.remove(0);
System.out.println(name+"消费1件"+"当前仓库有"+warehouse.size()+"件");
}
}finally {
//最后释放
lock.unlock();
}
try {
sleep(200);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
Test.java
package producterandcustomer;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;
/**
* @author StarsOne
* @date Create in 2019-4-13 0013 14:57:26
* @description
*/
class Test {
public static void main(String[] args) {
List<Object> warehouse = new ArrayList<>();
Lock lock = new ReentrantLock();
new Cuotmer(warehouse, "小米", lock).start();
new Cuotmer(warehouse, "小蓝", lock).start();
new Cuotmer(warehouse, "小浩", lock).start();
new Cuotmer(warehouse, "小家", lock).start();
new Cuotmer(warehouse, "小留", lock).start();
new Producter(warehouse, "小一", lock).start();
new Producter(warehouse, "小二", lock).start();
new Producter(warehouse, "小香", lock).start();
new Producter(warehouse, "小叫", lock).start();
new Producter(warehouse, "小三", lock).start();
}
}
Java 学习笔记 使用并发包ReentrantLock简化生产者消费者模式代码的更多相关文章
- Java并发编程()阻塞队列和生产者-消费者模式
阻塞队列提供了可阻塞的put和take方法,以及支持定时的offer和poll方法.如果队列已经满了,那么put方法将阻塞直到有空间可用:如果队列为空,那么take方法将会阻塞直到有元素可用.队列可以 ...
- java多线程15 :wait()和notify() 的生产者/消费者模式
什么是生产者/消费者模型 一种重要的模型,基于等待/通知机制.生产者/消费者模型描述的是有一块缓冲区作为仓库,生产者可将产品放入仓库,消费者可以从仓库中取出产品,生产者/消费者模型关注的是以下几个点: ...
- Java 学习笔记 网络编程 使用Socket传输文件 CS模式
Socket的简单认识 Socket是一种面向连接的通信协议,Socket应用程序是一种C/S(Client端/Server端)结构的应用程序 Socket是两台机器间通信的端点. Socket是连接 ...
- 0037 Java学习笔记-多线程-同步代码块、同步方法、同步锁
什么是同步 在上一篇0036 Java学习笔记-多线程-创建线程的三种方式示例代码中,实现Runnable创建多条线程,输出中的结果中会有错误,比如一张票卖了两次,有的票没卖的情况,因为线程对象被多条 ...
- java 多线程 22 :生产者/消费者模式 进阶 利用await()/signal()实现
java多线程15 :wait()和notify() 的生产者/消费者模式 在这一章已经实现了 wait/notify 生产消费模型 利用await()/signal()实现生产者和消费者模型 一样 ...
- Java多线程高并发学习笔记(二)——深入理解ReentrantLock与Condition
锁的概念 从jdk发行1.5版本之后,在原来synchronize的基础上,增加了重入锁ReentrantLock. 本文就不介绍synchronize了,有兴趣的同学可以去了解一下,本文重点介绍Re ...
- 《Java学习笔记(第8版)》学习指导
<Java学习笔记(第8版)>学习指导 目录 图书简况 学习指导 第一章 Java平台概论 第二章 从JDK到IDE 第三章 基础语法 第四章 认识对象 第五章 对象封装 第六章 继承与多 ...
- Java学习笔记:语言基础
Java学习笔记:语言基础 2014-1-31 最近开始学习Java,目的倒不在于想深入的掌握Java开发,而是想了解Java的基本语法,可以阅读Java源代码,从而拓展一些知识面.同时为学习An ...
- Java学习笔记4
Java学习笔记4 1. JDK.JRE和JVM分别是什么,区别是什么? 答: ①.JDK 是整个Java的核心,包括了Java运行环境.Java工具和Java基础类库. ②.JRE(Java Run ...
随机推荐
- Nginx负载均衡的5种策略(转载)
Nginx的upstream目前支持的5种方式的分配 轮询(默认) 每个请求按时间顺序逐一分配到不同的后端服务器,如果后端服务器down掉,能自动剔除. upstream backserver { s ...
- Windows系统MySQL安装配置
MySQL是一个开放源代码的数据库管理系统,是由MySQL AB公司开发.发布并支持的,现在属于Oracle旗下产品. 与其他大型数据库管理系统如Oracle.DB2.SQL Server等相比,虽然 ...
- node.js搭建Web服务器
Node.js 博客搭建 一. 学习需求 Node 的安装运行 会安装node,搭建node环境 会运行node. 基础模块的使用 Buffer:二进制数据处理模块 Event:事件模块 fs:文件系 ...
- 控件包含代码块(即 <% ... %>),因此无法修改控件集合。
原因分析:在head里写的js代码中包含了<%=...%>代码 解决:把js的代码放到body中...
- 将字符串XX,SS以“,”符号进行区分并分别存储在数组中
public static void main(String[] args) { String str = "EAN_13,1534651"; String strs[] = st ...
- Ajax实现聊天室
Ajax实现聊天室 运行效果如下: 代码显示: var net=new Object();//编写构造函数net.AjaxRequest=function(url,onload,onerror,met ...
- linux常见命令实践.
ls -la : 给出当前目录下所有文件的一个长列表,包括以句点开头的“隐藏”文件 ls -a . .. 1 online_tools online_tools_0803 ll: 竖列显示所有文件 l ...
- SSIS - 8.FTP 任务
FTP全称为 File Transfer Protocol(文件传输协议),是通过TCP网络将文件从一个服务器传输到另一个服务器.在SSIS包中,FTP任务是用来实现FTP功能的. 一.创建FTP连接 ...
- 初学Socket通信
1.Socket:Socket就是套接字.客户端与服务器之间通信用的.Socket接口是TCP/IP网络的API. 2.SYN是TCP/IP建立连接时使用的握手信号.在客户端和服务器之间建立正常的TC ...
- 简单实用而不追求时髦的 Vim 配置
前言 由于 Vim 的广泛流行,在网络上关于 Vim 的自定义配置汗牛充栋.既有高手 Tim Pope 的极简配置 tpope/vim-sensible(这个配置一个插件都没有),也有 spf13/s ...