线程通信-----生产者与消费者案例
发布日期:2021-06-28 13:57:20
浏览次数:9
分类:技术文章
本文共 2267 字,大约阅读时间需要 7 分钟。
import java.util.LinkedList;public class Test { public static void main(String[] args) { Baskets baskets = new Baskets(); Producters producters = new Producters(baskets); Consumers consumers = new Consumers(baskets); producters.start();//生产者进行生产 consumers.start();//消费者进行消费 }}/** * 消费者线程 * @author Administrator * */class Consumers extends Thread{ private Baskets baskets = null; public Consumers(Baskets baskets) { this.baskets = baskets; } @Override public void run() { baskets.popApple(); }}/** * 生产者线程 * @author Administrator * */class Producters extends Thread{ private Baskets baskets = null; public Producters(Baskets baskets) { this.baskets = baskets; } @Override public void run() { baskets.pushApple(); }}class Baskets{ private LinkedListbasket = new LinkedList<>();//创建一个篮子原来存放Apples /** * 分四次取出苹果 */ public synchronized void popApple() {//需要声明同步方法才能获得该对象的锁 for(int i=0;i<20;i++) { pop(); } } /** * 分四次放苹果 */ public synchronized void pushApple() {//需要声明同步方法才能获得该对象的锁 for(int i=0;i<20;i++) { Apples apples = new Apples(i); push(apples); } } /** * 取出苹果 * @param apples */ public void pop() { if(basket.size() == 0) {//当篮子里面的苹果为0,通知并等待生产者来生产 try { wait();//等待并释放当前该对象锁 } catch (InterruptedException e) { e.printStackTrace(); } } try { Thread.sleep(500); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println("取出"+basket.removeFirst().toString()); notify();//通知生产者来生产 } /** * 存放苹果 * @param apples */ public void push(Apples apples) { if(basket.size() == 5) {//当篮子里面的苹果满了通知并等待消费者来消费 try { wait();//等待并释放当前该对象锁 } catch (InterruptedException e) { e.printStackTrace(); } } try { Thread.sleep(500); } catch (InterruptedException e) { e.printStackTrace(); } basket.addFirst(apples); System.out.println("存放"+apples.toString()); notify();//通知消费者来消费 } }class Apples{ private int id; public Apples(int id) {//给每个苹果标号 this.id = id ; } public String toString() { return "苹果"+(id+1); }}
【运行结果】
存放苹果1
存放苹果2存放苹果3存放苹果4存放苹果5取出苹果5取出苹果4取出苹果3取出苹果2取出苹果1存放苹果6存放苹果7存放苹果8存放苹果9存放苹果10取出苹果10取出苹果9取出苹果8取出苹果7取出苹果6存放苹果11存放苹果12存放苹果13存放苹果14存放苹果15取出苹果15取出苹果14取出苹果13取出苹果12取出苹果11存放苹果16存放苹果17存放苹果18存放苹果19存放苹果20取出苹果20取出苹果19取出苹果18取出苹果17取出苹果16转载地址:https://blog.csdn.net/wyf2017/article/details/80377411 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!
发表评论
最新留言
表示我来过!
[***.240.166.169]2024年04月17日 09时01分43秒
关于作者
喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
nginx1.19配置SSL证书
2019-04-29
Windows10 打开多个微信
2019-04-29
windows清理c盘文件
2019-04-29
nginx限制访问系统功能
2019-04-29
nginx1.19去掉版本信息
2019-04-29
ubuntu 18.04.5 server版安装ruby2.3.5
2019-04-29
ubuntu18.04.5 sever下ruby安装imagemagick错误问题
2019-04-29
Ubuntu18.04安装mongodb
2019-04-29
windows设置远程连接Mysql
2019-04-29
linux安装redis
2019-04-29
idea开发工具清除缓存/重启方式
2019-04-29
FreeSwitch_CallCenter_Tiers
2019-04-29
时钟案例
2019-04-29
JQ实现手风琴案例
2019-04-29
2021-05-06
2019-04-29
2021-05-06
2019-04-29
2021-06-08
2019-04-29
2021-06-17
2019-04-29
2021-06-28
2019-04-29
java编程练习之回文数
2019-04-29