线程之“生产者消费者”
来源:互联网 发布:诺基亚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
- 线程之“生产者消费者”
- 线程之生产者消费者
- 线程之生产者、消费者
- 线程同步之生产者消费者
- Java 线程之生产者消费者
- 线程之生产者消费者模型
- 生产者消费者问题之Java线程实现
- 线程同步之经典生产者-消费者模型
- java线程之生产者消费者问题
- java线程经典之生产者与消费者
- 线程之路五:消费者生产者
- 线程间通信之生产者消费者问题
- 线程之消费者和生产者问题代码
- 初识线程之 生产者消费者模型
- 线程同步之生产者-消费者问题
- JAVA线程之生产者消费者问题
- Qt之线程同步(生产者消费者模式
- Qt之线程同步(生产者消费者模式
- 位操作训练
- 作业感悟
- Java基础学习总结(10)—— Cookie/Session机制详解
- VB+语音识别软件
- Spark算子使用示例
- 线程之“生产者消费者”
- 关于PT/DC 中查看固定值的方法
- 单链表的逆转
- 树链剖分_MODLE
- 分治算法
- 位操作训练
- 保留位置
- Android Studio Terminal 不是内部或外部命令,也不是可运行程序或批处理文件
- servlet实现文件上传