java中多线程模拟(多生产,多消费,Lock实现同步锁,替代synchronized同步代码块)
import java.util.concurrent.locks.*;
class DuckMsg{
int size;//烤鸭的大小
String id;//烤鸭的厂家和标号
DuckMsg(){ } DuckMsg(int size, String id){
this.size=size;
this.id=id;
} public String toString(){
return id + " 大小为:" + size;
}
}
class Duck{ private int count=0;//生产烤鸭的总数
private int putId=0, takeId=0;//分别表示存入的Id 和 取出烤鸭的Id Lock lock = new ReentrantLock();
DuckMsg[] dk = new DuckMsg[100];//烤鸭的容器
Condition conProduce = lock.newCondition();
Condition conConsume = lock.newCondition(); public void put(int sz){
lock.lock();
try{
while(count==dk.length)//一直等到烤鸭全部生产完毕之后所有的生产线程都停止....
conProduce.await();
dk[putId++]=new DuckMsg(sz, Thread.currentThread().getName()+":"+(putId-1));
if(putId==dk.length) putId=0;//啥意思呢?烤鸭的编号就是1到100, 如果过了100,那么再从编号1开始!
++count;
conConsume.signal();
}catch(InterruptedException e){ }finally{
lock.unlock();
}
} public void get(){
lock.lock();
try{
while(count==0)
conConsume.await();
System.out.println(dk[takeId++]);
System.out.println("......." + Thread.currentThread().getName());//打印消费的厂家
if(takeId==dk.length) takeId=0;
--count;
conProduce.signal();
}catch(InterruptedException e){ }finally{
lock.unlock();
}
}
} class Producer implements Runnable{
Duck duck;
Producer(Duck duck){
this.duck=duck;
}
public void run(){
for(int i=1; ; ++i)
duck.put(i);
}
} class Consumer implements Runnable{
Duck duck;
Consumer(Duck duck){
this.duck=duck;
}
public void run(){
while(true)
duck.get();
}
} public class ProduceConsumeDemo{ public static void main(String[] args){
Duck duck=new Duck();
Thread t1 = new Thread(new Producer(duck), "生产厂家 1");
Thread t2 = new Thread(new Producer(duck), "生产厂家 2");
Thread t3 = new Thread(new Consumer(duck), "消费厂家 1");
Thread t4 = new Thread(new Consumer(duck), "消费厂家 2"); t1.start();
t2.start();
t3.start();
t4.start();
}
}
java中多线程模拟(多生产,多消费,Lock实现同步锁,替代synchronized同步代码块)的更多相关文章
- 2.1多线程(java学习笔记) java中多线程的实现(附静态代理模式)
一.多线程 首先我们要清楚程序.进程.线程的关系. 首先进程从属于程序,线程从属于进程. 程序指计算机执行操作或任务的指令集合,是一个静态的概念. 但我们实际运行程序时,并发程序因为相互制约,具有“执 ...
- Java进阶(四十二)Java中多线程使用匿名内部类的方式进行创建3种方式
Java中多线程使用匿名内部类的方式进行创建3种方式 package cn.edu.ujn.demo; // 匿名内部类的格式: public class ThreadDemo { public st ...
- java中多线程详解-synchronized
一.介绍 当多个线程涉及到共享数据的时候,就会设计到线程安全的问题.非线程安全其实会在多个线程对同一个对象中的实例变量进行并发访问时发生,产生的后果就是“脏读”.发生脏读,就是取到的数据已经被其他的线 ...
- java中多线程执行时,为何调用的是start()方法而不是run()方法
Thead类中start()方法和run()方法的区别 1,start()用来启动一个线程,当调用start()方法时,系统才会开启一个线程,通过Thead类中start()方法来启动的线程处于就绪状 ...
- Java中多线程的使用(超级超级详细)线程池 7
Java中多线程的使用(超级超级详细)线程池 7 什么是线程池? 线程池是一个容纳多个线程的容器,线程池中的线程可以重复使用,无需反复创建线程而消耗过多的资源 *使用多线程的好处: 1.降低消耗,减少 ...
- Java中多线程的使用(超级超级详细)线程安全原理解析 4
Java中多线程的使用(超级超级详细)线程安全 4 什么是线程安全? 有多个线程在同时运行,这些线程可能会运行相同的代码,程序运行的每次结果和单线程运行的结果是一样的,而且其他变量的值也和预期的值一样 ...
- java多线程(三)——锁机制synchronized(同步语句块)
用关键字synchronized声明方法在某些情况下是有弊端的,比如A线程调用同步方法之行一个长时间的任务,那么B线程必须等待比较长的时间,在这样的情况下可以使用synchronized同步语句快来解 ...
- Java中多线程
引 如果对什么是线程.什么是进程仍存有疑惑,请先Google之,因为这两个概念不在本文的范围之内. 用多线程只有一个目的,那就是更好的利用cpu的资源,因为所有的多线程代码都可以用单线程来实现.说这个 ...
- Java中多线程并发体系知识点汇总
一.多线程 1.操作系统有两个容易混淆的概念,进程和线程. 进程:一个计算机程序的运行实例,包含了需要执行的指令:有自己的独立地址空间,包含程序内容和数据:不同进程的地址空间是互相隔离的:进程拥有各种 ...
随机推荐
- js获取倒计时
<html> <head> <title>出错啦~~~</title> <link href="css/login1.css" ...
- 【整理】--C++三种参数传递方式
在C++中,共有三种参数传递方式: 按值传递(pass by value) 地址传递(pass by pointer) 引用传递(pass by reference) (1)按值传递的过程为:首先计算 ...
- python easy_install pip django
1. install python (2.7.8) 2. set PATH, add python27 3. python easy_install.py 4. easy_install pip 5. ...
- 《理解 ES6》阅读整理:函数(Functions)(八)Tail Call Optimization
尾调用优化(Tail Call Optimization) 尾调用是指函数的最后一条语句是函数调用,比如下面的代码: function doSomething() { return doSomethi ...
- Linux下安装mysql数据库
l 检查是否已安装mysql的相关包 [root@localhost ~]# rpm -qa|grep -i mysql MySQL-server-5.6.19-1.el6.x86_64 MySQL- ...
- 网页版视频网站可以用html5来实现吗?
当然可以用html5来实现视频网站,而且html5的诞生完全符合了百度优化,百度蜘蛛对这类的网站友好度非常高,会尽量会给高的权重,但是现在很多做 这类网站的开发还是比较习惯用websocket,这个东 ...
- SCI Index
Nature.[link] Science.[link] ...
- Redis 队列操作
class Program { //版本2:使用Redis的客户端管理器(对象池) public static IRedisClientsManager redisClientManager = ne ...
- 使用 Productivity Power Tools 高级扩展 来帮助你提高 VS2012 的工作效率
Productivity Power Tools 高级工具是帮助开发者提高工作效率的, 用于 Visual Studio 2012 专业版(及以上) 的一组免费扩展. 本文大多数内容译自MSDN:ht ...
- ZeroMQ研究与应用分析
1 ZeroMQ概述 ZeroMQ是一种基于消息队列的多线程网络库,其对套接字类型.连接处理.帧.甚至路由的底层细节进行抽象,提供跨越多种传输协议的套接字.ZeroMQ是网络通信中新的一层,介于应用 ...