java多线程学习之生产者与消费者(二)
来源:互联网 发布:tom大叔 javascript 编辑:程序博客网 时间:2024/06/06 03:26
package javaapplication3;/** *多线程多消费及其解决 * 问题1:重复生产,重复消费;原因:被唤醒的线程没有判断标记就开始工作(生产0r消费)了 * 解决:被唤醒的线程必须被判断标记 * 使用while循环判断标记 * 问题2:死锁,所有的线程都处于冻结状态;原因:本方线程在唤醒时,又一次唤醒了本方线程, * 而本方线程循环判断标记,继续的等待导致所有的线程店都等待 * 解决:使用notifyAll()方法 * * 实现了多生产多消费的功能但是唤醒了本方线程浪费了CPU,效率不高 * @author tf */class Res{ private String name; private int count=1; //定义标记 private boolean flag; //提供给商品数值的方法 public synchronized void set(String name) { while(flag)//判断标记为true,执行wait等待,为false就生产 try{this.wait();}catch(InterruptedException e){} this.name=name+"---"+count; count++; System.out.println(Thread.currentThread().getName()+".....生产者....."+this.name); //生产完毕,将标记改为true flag=true; //唤醒消费者 this.notifyAll(); } public synchronized void get() { while(!flag)//判断标记为true,执行wait等待,为false就生产 try{this.wait();}catch(InterruptedException e){} System.out.println(Thread.currentThread().getName()+".....消费者....."+this.name); //消费完毕,将标记改为false flag=true; //唤醒生产者 this.notifyAll(); }}class Producer implements Runnable{ private Res r; Producer (Res r) { this.r=r; } public void run() { r.set("面包"); }}//消费者class Consumer implements Runnable{ private Res r; Consumer(Res r)//构造函数 { this.r =r; } public void run() { r.get(); }}public class JavaApplication3 { /** * @param args the command line arguments */ public static void main(String[] args) { // TODO code application logic here Res r=new Res(); Producer pro=new Producer(r); Consumer con=new Consumer(r); Thread t0=new Thread(pro); Thread t1=new Thread(pro); Thread t2=new Thread(con); Thread t3=new Thread(con); t0.start(); t1.start(); t2.start(); t3.start(); }}
阅读全文
0 0
- java多线程学习之生产者与消费者(二)
- JAVA 多线程之生产者与消费者
- Java多线程之生产者与消费者
- Java多线程之生产者与消费者
- Java多线程之 生产者与消费者
- java多线程之生产者与消费者案例
- Java多线程生产者/消费者模式(二)
- Java多线程学习之生产者消费者问题(一)
- Java多线程之生产者与消费者实现(1p1c)
- Java多线程 之 生产者、消费者(十三)
- java多线程学习生产者消费者
- java多线程 生产者与消费者
- 【Java多线程】-生产者与消费者
- JAVA - 多线程 - 生产者与消费者
- Java多线程-生产者与消费者
- [Java]多线程之生产者消费者
- java多线程之生产者消费者
- Java多线程之生产者消费者
- 使用Tensorboard查看训练过程
- 修改war包内容
- 7.数组转字符串
- 利用proxychains在终端使用socks5代理
- 三.scrapy配置参数
- java多线程学习之生产者与消费者(二)
- View 基础
- struts2获取<s:checkbox>的值为true
- Ants -暴力枚举
- 深入浅出Mybatis系列(九)---强大的动态SQL
- 关于Python的time模块常用函数
- python基础_2
- php 协程 generator中的yield实现协程
- java中的时间戳