线程生产者与消费者
来源:互联网 发布:仓库,财务办公软件 编辑:程序博客网 时间:2024/05/16 09:38
线程出现重复取和重复赋值的情况
class Info{private String name;private String content;public void setName(String name){this.name = name ;}public void setContent(String content){this.content = content ;}public String getName(){return this.name ;}public String getContent(){return this.content ;}public synchronized void set(String name, String content){this.setName(name);try{Thread.sleep(300);}catch(Exception e){e.printStackTrace();}this.setContent(content);}public synchronized void get(){try{Thread.sleep(300);}catch(Exception e){e.printStackTrace();}System.out.println(this.getName() + "<--->" + this.getContent());}}class Producer implements Runnable{private Info info;public Producer(Info info){this.info = info;}@Overridepublic void run(){boolean flag = false;for (int i=0;i<50 ;i++ ){if(flag){this.info.set("123", "789");flag = false;}else{this.info.set("abc", "xyz");flag = true;}}}}class Consumer implements Runnable{private Info info;public Consumer(Info info){this.info = info;}@Overridepublic void run(){for(int i=0;i<50 ;i++ ){this.info.get();}}}public class T3 {public static void main(String[] args) {Info info = new Info();Producer pro = new Producer(info);Consumer con = new Consumer(info);new Thread(pro).start();new Thread(con).start();}}
利用Object类的wait()和notify()方法
class Info{private String name = "123";private String content = "789";private boolean flag = false;public void setName(String name){this.name = name ;}public void setContent(String content){this.content = content ;}public String getName(){return this.name ;}public String getContent(){return this.content ;}public synchronized void set(String name, String content){if(!flag){try{super.wait();}catch(Exception e){e.printStackTrace();}}this.setName(name);try{Thread.sleep(300);}catch(Exception e){e.printStackTrace();}this.setContent(content);flag = !flag;super.notify();}public synchronized void get(){if(flag){try{super.wait();}catch(Exception e){e.printStackTrace();}}try{Thread.sleep(300);}catch(Exception e){e.printStackTrace();}System.out.println(this.getName() + "<--->" + this.getContent());flag = !flag;super.notify();}}class Producer implements Runnable{private Info info;public Producer(Info info){this.info = info;}@Overridepublic void run(){boolean flag = false;for (int i=0;i<50 ;i++ ){if(flag){this.info.set("123", "789");flag = false;}else{this.info.set("abc", "xyz");flag = true;}}}}class Consumer implements Runnable{private Info info;public Consumer(Info info){this.info = info;}@Overridepublic void run(){for(int i=0;i<50 ;i++ ){this.info.get();}}}public class T4 {public static void main(String[] args) {Info info = new Info();Producer pro = new Producer(info);Consumer con = new Consumer(info);new Thread(pro).start();new Thread(con).start();}}
- 线程生产者与消费者
- 线程---生产者与消费者
- 线程(消费者与生产者)
- java线程 生产者与消费者
- java线程 生产者与消费者
- 线程锁,生产者与消费者
- 线程(三)线程协作生产者与消费者
- 同步线程--生产者与消费者模式
- Windows线程(生产者与消费者问题)
- java线程模拟生产者与消费者
- 生产者与消费者 java经典线程法
- 消费者与生产者线程同步程序
- JAVA线程(生产者与消费者)
- Windows线程(生产者与消费者问题)
- 线程同步(消费者与生产者)
- JAVA 线程间通信 - 生产者与消费者
- 线程经典,生产者与消费者问题
- C#生产者与消费者问题 线程同步
- 黑马程序员-JAVA 高级技术(泛型)
- Web应用程序风险评估工具介绍 Penetration Testing with the Joomla Security Scanner
- aspnet_regiis.exe注册IIS
- jQuery Mobile界面图标显示不正常解决
- ORACLE FORALL介绍
- 线程生产者与消费者
- spring注解入门
- [二叉树] 层次遍历算法
- 【Android UI设计与开发】第18期:滑动菜单栏(三)SlidingMenu动画效果的实现
- 结束了,my编译
- unbuntu desktop安装eclipse方法
- spring -bean 的创建过程
- 基于Mongodb进行分布式数据存储
- UVA oj 练习水题 算法入门经典(大数系列)