Java多线程五:生产者和消费者模型(单个对单个)
来源:互联网 发布:python ftp 下载文件 编辑:程序博客网 时间:2024/06/05 07:50
多线程协同任务之:生产者和消费者模型
介绍
在上一篇中介绍了多线程的等待和唤醒机制,这一篇我们就实践一下,单个生成这和单个消费模型。假如有一个资源类Resouce,其有一个属性name属性和我们赋予的一个标识为flag属性。 现在通过启动多线程(其实就是两个线程生产线程和消费线程),来达到一边赋值一边取值打印的效果。
Resource类定义
public class Resource { /** 标识位 */ private boolean flag = false; /** 资源名称 */ private String name; //setter和getter方法 ...}
ProductThread线程类
public class ProductThread implements Runnable { /** 资源对象 */ private Resource resource; public ProductThread(Resource resource) { this.resource = resource; } @Override public void run() { int count = 0; while (true) { synchronized (resource) { if (resource.isFlag()) {// 如果有产品这个线程就放弃执行权 try { resource.wait(); } catch (InterruptedException e) { e.printStackTrace(); } } else {// 如果没有产品就生产,生产完之后通知消费者 count++; resource.setName("产品" + count); System.out.println("生产者 product:" + resource.getName()); resource.setFlag(true); resource.notify(); } } } }}
ConsumeThread线程类
public class ConsumeThread implements Runnable { /** 资源对象*/ private Resource resource; public ConsumeThread(Resource resource) { this.resource = resource; } @Override public void run() { while (true) { synchronized (resource) { if (resource.isFlag()) {// 如果有产品,就直接消费。消费完之后通知生产线程 System.out.println("消费者consume:" + resource.getName()); resource.setFlag(false); resource.notify(); } else {// 如果没有产品,就等待生产者生产产品 try { resource.wait(); } catch (InterruptedException e) { e.printStackTrace(); } } } } }}
执行结果
main方法
public static void main(String[] args) { Resource resource = new Resource(); //生产者线程 ProductThread productThread = new ProductThread(resource); //消费者线程 ConsumeThread consumeThread = new ConsumeThread(resource); new Thread(productThread).start(); new Thread(consumeThread).start();}
总结
最容易弄错的地方就是,什么时候调用wait方法什么时候调用notify方法,这一点确实不好说。通常是当这一边的线程不用执行任何代码时,那么久调用wait方法,放弃执行权,如果当这边修改了某标识位之后, 想让对方执行那么久执行notify方法。这么说还是显得比较抽象,暂时还没想到比较简单的说法,还是和应用场景有关,很难总结。
0 0
- Java多线程五:生产者和消费者模型(单个对单个)
- 单个生产者和单个消费者模型(spsc)
- 生产者消费者模型(单个生产者和单个消费者)
- Java 多线程 (PART XVI)生产者消费者(I) 单个生产者单个消费者
- 生产者消费者 多线程 单个缓冲区 Win32API实现
- Java多线程六:生产者和消费者模型(多对多)
- Linux互斥与同步应用(三):posix线程实现单个生产者和单个消费者模型
- java多线程之生产者和消费者模型
- java多线程--生产者和消费者模型
- Napajs demo-单个生产者/消费者
- java多线程生产者、消费者模型
- Java多线程 -- 生产者消费者模型
- Java 多线程:生产者消费者模型
- Java 多线程:生产者消费者模型
- 多线程模型:生产者和消费者
- JAVA 生产者和消费者模型
- Java 多线程 生产者和消费者
- Java多线程-生产者和消费者
- 设计模式总结之Strategy Pattern(策略模式)
- ubuntu 安装crt
- Java异常体系结构
- 运用JS设置cookie、读取cookie、删除cookie
- 关于D3JS图表库的学习
- Java多线程五:生产者和消费者模型(单个对单个)
- 使用UIPageViewController进行多页面管理 -
- Linux shell脚本攻略-学习笔记(7-9章)
- CodeForces 589A -- A. Email Aliases (字符串水题 STL)
- 把mysql和apache 加入到windows 服务中
- C语言与C++中static,extern的用法及区别总结
- 利用RecycleView实现类似ListView的Item点击,长按等操作事件以及点击后每一项在添加一个列表
- let变量
- ListView缓存原理剖析