• linkedu视频
  • 平面设计
  • 电脑入门
  • 操作系统
  • 办公应用
  • 电脑硬件
  • 动画设计
  • 3D设计
  • 网页设计
  • CAD设计
  • 影音处理
  • 数据库
  • 程序设计
  • 认证考试
  • 信息管理
  • 信息安全
菜单
linkedu.com
  • 网页制作
  • 数据库
  • 程序设计
  • 操作系统
  • CMS教程
  • 游戏攻略
  • 脚本语言
  • 平面设计
  • 软件教程
  • 网络安全
  • 电脑知识
  • 服务器
  • 视频教程
  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号
您的位置:首页 > 程序设计 >Java > Java中多线程通信实例:生产者消费者模式

Java中多线程通信实例:生产者消费者模式

作者:diuleilaomo 字体:[增加 减小] 来源:互联网 时间:2017-10-21

diuleilaomo通过本文主要向大家介绍了等相关知识,希望对您有所帮助,也希望大家支持linkedu.com www.linkedu.com

线程间的通信:其实就是多个线程在操作同一个资源,但是操作的动作不同

当某个线程进入synchronized块后,共享数据的状态不一定满足该线程的需要,需要其他线程改变共享数据的状态后才能运行,而由于当时线程对共享资源时独占的,它必须解除对共享资源的锁定的状态,通知其他线程可以使用该共享资源。

Java中的 wait(),notify(),notifyAll()可以实现线程间的通信。

生产者–消费者问题是典型的线程同步和通信问题

  • 生产者生成出产品,消费者去购买产品
  • 创建三个线程,一个主控线程,一个生产者线程,一个消费者线程,
  • 创建一个堆栈 Stack,生成线程生成的产品放置到堆栈中,然后消费者线程在堆栈中取走产品
/**
 * 创建一个堆栈 Stack,生产者线程生成的产品放置到堆栈中,然后消费者线程在堆栈中取走产品
 * Created by ZhangJun on 2017/10/21.
 */

public class ProductStack {

    private int index = 0;
    private String[] datas = new String[5];

    /**
     * 生成产品的方法
     *
     * @param product
     */
    public synchronized void setProduct(String product) {
        // 如果堆栈满了,调用wait()等待消费者取走产品
        while (index == datas.length) {
            try {
                this.wait();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
        // 生产者被唤醒后,开始放置产品到堆栈中
        this.notify();
        datas[index] = product;
        System.out.println("生产者生产产品:" + product);
    }

    /**
     * 获取产品的方法
     *
     * @return product
     */
    public synchronized String getProduct() {
        // 如果堆栈是空的,调用wait()等待生产者生产产品
        while (index == 0) {
            try {
                this.wait();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
        // 消费者被唤醒后,开始从堆栈取走产品,然后通知生产者继续生产产品
        this.notify();
        index--;
        System.out.println("消费者消费产品:" + datas[index]);
        return datas[index];
    }

}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
/**
 * 生产者类
 * Created by ZhangJun on 2017/10/21.
 */

public class Producer extends Thread {

    private ProductStack mProductStack;

    public Producer(ProductStack ps) {
        this.mProductStack = ps;
    }

    @Override
    public void run() {
        //生产线程
        String[] str = {"娃哈哈", "百事可乐", "鲜橙多", "伊利优酸乳", "雪碧", "冰红茶"};
        int random = (int) (Math.random() * str.length);
        System.out.println(str[random]);
        for (String aStr : str) {
            mProductStack.setProduct(aStr);
        }
    }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
/**
 * 消费者类
 * Created by ZhangJun on 2017/10/21.
 */

public class Consumer extends Thread {

    private ProductStack mProductStack;

    public Consumer(ProductStack ps) {
        this.mProductStack = ps;
    }

    @Override
    public void run() {
        //消费线程
        String[] products = new String[6];
        for (int i = 0; i < products.length; i++) {
            products[i] = mProductStack.getProduct();
        }
        System.out.println("消费者消费的所有产品:" + products);
    }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
/**
 * 主控线程 main
 * Created by ZhangJun on 2017/10/21.
 */

public class Main {

    public static void main(String[] args) {
        ProductStack mProductStack = new ProductStack();
        new Producer(mProductStack).start();
        new Consumer(mProductStack).start();
    }
}北京激光祛斑http://www.6ysh.com/
祛斑哪家好http://www.6ysh.com/
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
分享到:QQ空间新浪微博腾讯微博微信百度贴吧QQ好友复制网址打印

您可能想查找下面的文章:

相关文章

  • 2017-05-28Java Object类详解_动力节点Java学院整理
  • 2017-05-28Spring Boot(三)之找回熟悉的Controller,Service
  • 2017-05-28Java实现在不同线程中运行的代码实例
  • 2017-05-28springboot整合 beatlsql的实例代码
  • 2017-05-28详解SpringMVC注解版前台向后台传值的两种方式
  • 2017-05-28Spring整合Redis完整实例代码
  • 2017-05-28spring boot拦截器实现IP黑名单实例代码
  • 2017-05-28Java Scaner类详解_动力节点Java学院整理
  • 2017-05-28java 面试题闰年判断详解及实例
  • 2017-05-28spring boot整合Swagger2的示例代码

文章分类

  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号

最近更新的内容

    • Java多线程中的单例模式两种实现方式
    • Java中的拦截器、过滤器、监听器用法详解
    • Spring boot 整合CXF开发web service示例
    • 详解JAVA流程控制语句
    • 详解spring boot配置 ssl
    • SWT(JFace)体验之复制粘贴
    • JAVA简单工厂模式(从现实生活角度理解代码原理)
    • Java导出oracle表结构实例详解
    • Spring MVC url提交参数和获取参数
    • java面试笔试需准备内容

关于我们 - 联系我们 - 免责声明 - 网站地图

©2020-2025 All Rights Reserved. linkedu.com 版权所有