Java之多线程Runnable(2)卖烤鸭-yellowcong
来源:互联网 发布:银行卡四件套淘宝网 编辑:程序博客网 时间:2024/04/30 02:40
烤鸭模型中,涉及到多线程的交互,在多线程交互中,需要控制相同的锁,来保证线程的状态,同时还需要控制所有线程需要操作的共同对象(烤鸭数量),我把烤鸭数量对象放到了主类的静态变量汇总
锁对象
定一个锁,这样我们操作的时候,操作这个共同的锁,这样就不会导致死锁等问题
package com.yellowcong.xfdy.thread;/** * 创建日期:2017年10月3日 <br/> * 创建用户:yellowcong <br/> * 功能描述: */public class Lock { //用户锁 public static final Object PRODUCTOR_CUS_LOCK = new Object();}
生产者
生产者和消费者,使用的是同一个锁对象,这个很重要,因为只有同一个锁对象,这样才能保证线程的交互,通过操作锁的释放和等待,完成线程的交互
//等待线程,释放锁Lock.PRODUCTOR_CUS_LOCK.wait();//唤醒所有等待线程Lock.PRODUCTOR_CUS_LOCK.notifyAll();
代码
package com.yellowcong.xfdy.thread;/** * 创建日期:2017年10月3日 <br/> * 创建用户:yellowcong <br/> * 功能描述: */public class ThreadProductor implements Runnable{ public void run() { while(true){ producter(); } } /** * 生产者 * 创建日期:2017年10月3日<br/> * 创建用户:yellowcong<br/> * 功能描述: */ private void producter(){ synchronized(Lock.PRODUCTOR_CUS_LOCK){ //当小于5只的情况 if(TheadTest.ticketCnt <=5){ TheadTest.ticketCnt ++; try { Thread.sleep(100); } catch (InterruptedException e) { e.printStackTrace(); } TheadTest.totalCnt++; System.out.println(Thread.currentThread().getName()+"生产烤鸭,总共生产"+TheadTest.totalCnt+"只,还剩"+TheadTest.ticketCnt +"只"); //唤醒所有的线程 Lock.PRODUCTOR_CUS_LOCK.notifyAll(); }else if(TheadTest.ticketCnt >5){ //当大于5只的情况,就等待 try { System.out.println("还有"+TheadTest.ticketCnt +"只烤鸭,现在等,小于5只再生产"); //直接调用 wait进行等待,释放锁 Lock.PRODUCTOR_CUS_LOCK.wait(); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } } } }}
消费者
消费者对象,用的和生产者同样的锁,当烤鸭数量为0的情况,就Lock.PRODUCTOR_CUS_LOCK.wait()
,等待生产者生产烤鸭
package com.yellowcong.xfdy.thread;import java.util.Random;/** * 创建日期:2017年10月3日 <br/> * 创建用户:yellowcong <br/> * 功能描述: */public class ThreadCustomrer implements Runnable{ private Random random = new Random(); public void run() { while(true){ sell(); } } /** * 买票 * 创建日期:2017年10月3日<br/> * 创建用户:yellowcong<br/> * 功能描述: */ private void sell(){ synchronized(Lock.PRODUCTOR_CUS_LOCK){ if(TheadTest.ticketCnt == 0){ try { Lock.PRODUCTOR_CUS_LOCK.wait(); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } }else{ TheadTest.ticketCnt --; try { Thread.sleep(random.nextInt(10)*100); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println(Thread.currentThread().getName()+"还剩烤鸭"+TheadTest.ticketCnt ); Lock.PRODUCTOR_CUS_LOCK.notifyAll(); } } }}
主类
主类中,定义了烤鸭的数量和总量,两个静态变量,然后启动了两个的消费者和生产者。
package com.yellowcong.xfdy.thread;/** * 创建日期:2017年10月3日 <br/> * 创建用户:yellowcong <br/> * 功能描述: */public class TheadTest { //烤鸭数量 public static Integer ticketCnt = 10; //总共生产数量 public static Integer totalCnt = 0; public static void main(String [] args) { ThreadProductor pro = new ThreadProductor(); new Thread(pro,"生产线1号").start(); new Thread(pro,"生产线2号").start(); ThreadCustomrer cus = new ThreadCustomrer(); new Thread(cus,"消费者1号------>").start();; new Thread(cus,"消费者2号------>").start();; }}
阅读全文
0 0
- Java之多线程Runnable(2)卖烤鸭-yellowcong
- Java之多线程Runnable(1)卖票-yellowcong
- Java之多线程死锁-yellowcong
- Java之多线程CountDownLatch 用法 -yellowcong
- java编程之多线程 runnable的使用
- Java之多线程AtomicInteger (多人买票) -yellowcong
- java之多线程中Thread类和Runnable接口使用方法
- Java基础之多线程2
- Java之多线程机制-(2)
- Android(Java)之多线程结果返回——Future 、FutureTask、Callable、Runnable
- Java 线程 Thread Runnable
- java 线程 thread runnable
- Java之线程Runnable
- 【Java】Java之多线程
- Java基础知识之多线程(2)
- Java学习笔记之多线程 2
- Java基础总结之多线程(2)
- Java之多线程(2)--基础开篇
- 文章标题
- 顺序表的基本操作
- Docker 镜像的存储机制
- SonarQube插件开发自定义规则(1)简易demo
- POJ
- Java之多线程Runnable(2)卖烤鸭-yellowcong
- 566. Reshape the Matrix Difficult : Easy
- css之transform篇
- 【LibUIDK界面库系列文章】响应默认按钮
- 用顺序表实现俩有序顺序表拼接后还是有序的
- 九月总结:快速成长的一个月
- DateConverter does not support default String to 'Date' conversion
- C/C++程序的内存空间及堆、栈区比较
- JavaScript框架之AngularJS学习——作用域与事件(中)