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();;    }}