线程之“生产者消费者”

来源:互联网 发布:诺基亚6120软件下载 编辑:程序博客网 时间:2024/04/29 03:47

线程之“生产者消费者”

sleep():sleep来自Thread类,调用时线程睡眠但不释放当前对象锁(括号内加入睡眠时间,时间到后自然苏醒);

wait():wait来自Object类,调用线程睡眠释放当前对象锁定,进入等待线程池,出让系统资源,其他线程可以占用CPU资源,等待notify/notifyAll去对它进行唤醒后重新进入就绪态(括号内亦可加时间,与sleep方法类似);

synchronized:线程同步锁,当它用来修饰一个方法或者一个代码块的时候,能够保证在同一时刻最多只有一个线程执行该段代码。

notify():随机唤醒等待池线程,线程优先级越高,分配资源越多,唤醒概率越大;
notifyAll():唤醒所有wait()的线程。

其中sleep需要捕获异常,wait,notify/notifyAll不需要。

本次实验
生产者:做馒头,每做一个休息0.5s,当馒头大于10个时停止生产。
消费者:吃馒头,每吃一个休息1s,当馒头小于等于2个时唤醒生产者继续生产。

package Thread;//生产者public class Producer extends Thread {    private Container container;        public Producer(Container container){        super();        setName("生产者");        this.setContainer(container);    }    public Container getContainer() {        return container;    }    public void setContainer(Container container) {        this.container = container;    }    public void run(){        while(true){            container.add();//生产馒头            try {                Thread.sleep(500);            } catch (InterruptedException e) {                // TODO Auto-generated catch block                e.printStackTrace();            }        }    }}
package Thread;//消费者public class Consumer extends Thread {private Container container;        public Consumer(Container container){        super();        setName("消费者");        this.setContainer(container);    }    public Container getContainer() {        return container;    }    public void setContainer(Container container) {        this.container = container;    }    public void run(){        while(true){            container.sub();//吃馒头            try {                Thread.sleep(1000);            } catch (InterruptedException e) {                // TODO Auto-generated catch block                e.printStackTrace();            }        }    }}
package Thread;//容器,把 **数量的判断和增减** 抽取出来使用sychronized进行同步public class Container extends Thread {    public int size = 0;    /*public int count = 0;*/    public synchronized void add(){        String name = Thread.currentThread().getName();        //数量判断        if(size>=10){            System.out.println(name + "说:装不下啦!!我先休息一下!");            try {                this.wait();            } catch (InterruptedException e) {                // TODO Auto-generated catch block                e.printStackTrace();            }        }else {            //数量增减            System.out.println(name +"正在做馒头!"+ ++size);            if(size>5){                System.out.println("来吃馒头啦!!");            }            this.notify();        }    }    public synchronized void sub(){        String name = Thread.currentThread().getName();        //数量判断        if(size<=0){            System.out.println(name +"说:没馒头啦");            try {                this.wait();            } catch (InterruptedException e) {                // TODO Auto-generated catch block                e.printStackTrace();            }        }else {        //数量增减            System.out.println(name + "吃馒头!!"+  --size);            /*System.out.println(name + "我已经吃了"+  ++count +"个啦");*/            /*if(count>=10){                System.out.println(name +"吃不下了,休息一下!");                try {                    Thread.sleep(5000);                    count=0;                } catch (InterruptedException e) {                    // TODO Auto-generated catch block                    e.printStackTrace();                }                this.notify();            }*/            //数量判断            if(size<=2){                System.out.println(name +"大吼:快来做馒头!!");                this.notify();            }        }    }}
package Thread;public class Test {    public static void main(String[] args) {        Container container = new Container();        Producer producer = new Producer(container);        Consumer consumer = new Consumer(container);        producer.start();        consumer.start();    }}
0 0
原创粉丝点击