多线程之初理解
来源:互联网 发布:算法的乐趣 epub 编辑:程序博客网 时间:2024/05/22 14:41
生产者和消费者模式
生产者生产20个模具后,消费者开始消费,消费完之后,生产者又开始生产,周而复始......
工厂:
package com.xiaohao.output;import java.util.ArrayList;import java.util.List;/** * 注意几点: * 1.0 wait(),notifyAll()必须和同步锁一起使用 * 2.0 一个线程wait()之后,当再次被notifyAll()之后,是接着执行wait()之后的代码,所以,想要达到生产 * 无限循环的效果,必须将wait()放在while或for语句之中 * 3.0 notifyAll()在wait()之前使用,这样会起到交互执行的效果 * @author Administrator * */public class CacheArea {private List<Model> models = new ArrayList<Model>();private static int maxSize = 20;public synchronized void putModel() {while(models.size() < maxSize) {models.add(new Model());System.out.println("放入一个模具,模具总数: " + models.size());if(models.size() == maxSize) {System.out.println("箱子已经装满了!");notifyAll();try {wait();} catch (InterruptedException e) {// TODO Auto-generated catch blocke.printStackTrace();}}}}public synchronized void getModel() {while(models.size() > 0) {models.remove(0);System.out.println("消费一个模具,模具总数: " + models.size());if(models.size() == 0) {System.out.println("箱子没有模具了!");notifyAll();try {wait();} catch (InterruptedException e) {// TODO Auto-generated catch blocke.printStackTrace();}}}}}
生产者:
package com.xiaohao.output;public class Producer implements Runnable{private CacheArea c;public Producer(CacheArea c) {this.c = c;}@Overridepublic void run() {// TODO Auto-generated method stubc.putModel();}}
消费者:
package com.xiaohao.output;public class Consumer implements Runnable {private CacheArea c;public Consumer(CacheArea c) {this.c = c;}@Overridepublic void run() {// TODO Auto-generated method stubc.getModel();}}
测试代码:
package com.xiaohao.test;import java.util.concurrent.CountDownLatch;import java.util.concurrent.ExecutorService;import java.util.concurrent.Executors;import org.junit.Test;import com.xiaohao.output.CacheArea;import com.xiaohao.output.Consumer;import com.xiaohao.output.Producer;public class TestOutput {private CountDownLatch latch = new CountDownLatch(100);//用Junit测试多线程@Testpublic void OutPutTest01() {ExecutorService exe = Executors.newCachedThreadPool();CacheArea c = new CacheArea();exe.execute(new Producer(c));exe.execute(new Consumer(c));try {latch.await();} catch (InterruptedException e) {// TODO Auto-generated catch blocke.printStackTrace();}}}
输出结果:
放入一个模具,模具总数: 1
放入一个模具,模具总数: 2
放入一个模具,模具总数: 3
放入一个模具,模具总数: 4
放入一个模具,模具总数: 5
放入一个模具,模具总数: 6
放入一个模具,模具总数: 7
放入一个模具,模具总数: 8
放入一个模具,模具总数: 9
放入一个模具,模具总数: 10
放入一个模具,模具总数: 11
放入一个模具,模具总数: 12
放入一个模具,模具总数: 13
放入一个模具,模具总数: 14
放入一个模具,模具总数: 15
放入一个模具,模具总数: 16
放入一个模具,模具总数: 17
放入一个模具,模具总数: 18
放入一个模具,模具总数: 19
放入一个模具,模具总数: 20
箱子已经装满了!
消费一个模具,模具总数: 19
消费一个模具,模具总数: 18
消费一个模具,模具总数: 17
消费一个模具,模具总数: 16
消费一个模具,模具总数: 15
消费一个模具,模具总数: 14
消费一个模具,模具总数: 13
消费一个模具,模具总数: 12
消费一个模具,模具总数: 11
消费一个模具,模具总数: 10
消费一个模具,模具总数: 9
消费一个模具,模具总数: 8
消费一个模具,模具总数: 7
消费一个模具,模具总数: 6
消费一个模具,模具总数: 5
消费一个模具,模具总数: 4
消费一个模具,模具总数: 3
消费一个模具,模具总数: 2
消费一个模具,模具总数: 1
消费一个模具,模具总数: 0
箱子没有模具了!
......
阅读全文
0 0
- 多线程之初理解
- boost多线程之scoped_lock理解
- 理解多线程 之 40问题
- 多线程同步之信号量、互斥量之理解
- 理解 JAVA多线程技术之详解
- 多线程之进程与线程的理解
- 我所理解的多线程之synchronized
- 我所理解的多线程之Lock
- Java多线程之深入理解synchronize关键字
- iOS-多线程之NSOperation实例和理解
- iOS-多线程之GCD实例和理解
- 六.java多线程之常用函数理解
- 理解多线程
- 多线程理解
- 理解多线程
- 理解多线程
- 理解多线程
- 理解多线程
- SVN常用命令
- 筛法快速求解素数
- 用matlab在图像上画矩形框,并保存坐标到文本中
- Codeforces Round 833A-The Meaningless Game
- ios-饼图和柱状图的绘制
- 多线程之初理解
- Linux和Windonws下静态库与动态库(动态库篇)
- HDU3264 Open-air shopping malls【几何】
- Recycleview的各种炫酷应用
- 【转】【Oracle】oracle登录验证的三种方式(详解)
- [Leetcode P10]Regular Expression Matching 正则匹配
- 在linux下安装mysql
- STL——迭代器
- chrome调试js高能技巧