经过前面几节的学习,了解了多线程概念、Thread类的应用、多线程数据同步存在的问题及解决方法。本节给出一个并发编程实例应用案例,通过案例的学习,可以灵活地把多线程知识应用到实际编程中,解决在项目开发过程中遇到的并发编程问题。

在进入案例之前,先了解一下实现Java同步机制的几个方法,Java.lang.object类提供了wati()、notify()、notifyAll()方法,它们与synchronized关键字结合使用,可以建立很多优秀的同步模型。

当synchronized修饰的方法或代码块中的wati()方法被调用时,当前线程将被中断运行,并且放弃该对象的锁。

当另外的线程执行了某个对象的notify()方法后,会唤醒在此对象等待池中的某个线程,使之成为可运行的线程。notifyAll()方法会唤醒所有等待这个对象的线程,使之成为可运行的线程。

下面来看一个比较经典的问题:生产者(Producer)和消费者(Consumer)问题。这个问题的解决就是通过灵活使用wati()、notify()、notifyAll()方法来实现的。

任务要求如下:

生产者将产品交给店铺,消费者从店铺取走产品,店铺一次只能存储固定数量的产品,如果生产者生产了过多产品,店铺会让生产者等一下,如果店中有空间存储产品了,再通知生产者继续生产;如果店中没有产品了,店铺会告诉消费者等一下,如果店中有产品了,再通知消费者来取走产品。

要实现上述任务要求,我们需要定义一个生产者线程类和消费者线程类。再建立一个全局数组作为存储产品的缓冲区。其控制过程是,生产者向缓冲区存入产品,消费者从缓冲区取走产品。当缓冲区满时,生产者必须阻塞,等待消费者取走产品后将其唤醒。当缓冲区空时,消费者被阻塞,等待生产者生产了产品后将其唤醒。

(1)定义产品类,产品包含一个产品标识的id属性。另外要在生产或消费时打印产品的详细内容,因此重写toString()方法,产品类的代码如下所示:

(2)定义店铺类,店铺一次只能持有10份产品,如果生产者生产的产品多余10分,则会让当前正在此对象上操作的线程等待。一个线程访问addProduct方法时,它已经拿到这个锁了,当遇到产品大于10份时,它会阻塞。如果没有大于10份,则继续生产产品,并且调用notify方法,叫醒一个正在当前这个对象上等待的线程。这里请注意,notify和wait一般是一一对应的。代码如下所示:

(3)定义生产者线程类,生产者负责生产产品,每生产完一个产品,调用Thread类的sleep方法休眠一段时间,模拟生产过程。代码如下:

(4)定义消费者线程类,消费者负责消费产品,消费者每消费完一个产品,调用Thread类的sleep方法休眠一段时间,模拟消费过程。代码如下:

(5)定义主线程类。代码如下:

主线程类首先实例化Shop对象,然后分别实例化生产者线程和消费者线程。程序输出结果如下图所示:

■ 知识点拨

案例有两个线程类,分别是Producer类(生产者)和Consumer类(消费者),Shop类(店铺)负责产品的购进(存储产品的数量有限)与销售,因此Shop类需要协调Producer类和Consumer类,当Producer类生产过多产品时,Shop类需要调用wait方法让Producer类不要再继续生产,同时调用notify方法通知消费者来取走产品(如果有正在等待产品的消费者)。反之亦然,当无产品可取时,Shop类需要调用wait方法让Consumer类等待产品,同时调用notify方法通知生产者继续生产产品。

java 并发编程实例_Java并发编程案例解读相关推荐

  1. java 并发编程实例_java并发编程应用实例

    package com.juchaosoft.test; import java.util.concurrent.locks.Condition; import java.util.concurren ...

  2. python程序实例讲解_python入门编程实例 python入门编程实例解析

    python入门编程实例 python入门编程实例解析 python入门编程实例及解析: 题目:有1.2.3.4四个数字,能组成多少个互不相同且无重复数字的三位数?都是多少? 程序分析:可填在百位.十 ...

  3. java并发编程实践_Java并发编程实践如何正确使用Unsafe

    一.前言 Java 并发编程实践中的话: 编写正确的程序并不容易,而编写正常的并发程序就更难了.相比于顺序执行的情况,多线程的线程安全问题是微妙而且出乎意料的,因为在没有进行适当同步的情况下多线程中各 ...

  4. java 编程原理_Java网络编程 -- 网络编程基础原理

    Hello,今天记录下 Java网络编程 --> 网络编程基础原理. 一起学习,一起进步.继续沉淀,慢慢强大.希望这文章对您有帮助.若有写的不好的地方,欢迎评论给建议哈! 初写博客不久,我是杨展 ...

  5. java 网络编程 聊天_Java——网络编程(实现基于命令行的多人聊天室)

    目录: 1.ISO和TCP/IP分层模型 2.IP协议 3.TCP/UDP协议 4.基于TCP的网络编程 5.基于UDP的网络编程 6.基于TCP的多线程的聊天室的实现 1.ISO和TCP/IP分层模 ...

  6. java语言编程基础_java语言编程基础

    java语言基本要素 高级语言如c++.c#.java等都有一些共同性的东西:关键字.标识符. 运算符.注释.数据类型.常量和变量.语句.函数.数组.高级语言在这些要素上大同小异. Java关键字:一 ...

  7. java函数式编程例子_java函数式编程Lambda表达式的示例(一)

    函数式编程是时下比较流行的编程方式了,很多新兴的编程语言都对函数式编程有了比较好的支持,她有别于传统的命令式编程,可以将函数(执行代码的过程)作为参数进行传递.JAVA也意识到了函数式编程的重要性,在 ...

  8. java ldap操作实例_Java Spring Security示例教程中的2种设置LDAP Active Directory身份验证的方法...

    java ldap操作实例 LDAP身份验证是世界上最流行的企业应用程序身份验证机制之一,而Active Directory (Microsoft为Windows提供的LDAP实现)是另一种广泛使用的 ...

  9. plc 编程 c语言编程实例,PLC面向对象编程和梯形图编程,谁OUT了?

    在工业自动化领域,梯形图逻辑仍然是最常用的编程语言之一,但对于更加复杂的控制对象,面向对象编程不失为一种高效率的方式.下面先来谈谈面向对象编程: 面向对象编程是计算机高级语言的一种先进的编程模式,在工 ...

最新文章

  1. Electron中 提示:Uncaught ReferenceError: process is not defined
  2. 阿里巴巴与清华大学成立联合实验室,探索下一代人机自然交互
  3. 买家和卖家也可以这样对话
  4. 2.导数——线性代数回顾、曲线概念_1
  5. python06-常用模块
  6. 3.9 YOLO 算法
  7. 数据分析师—Excel实战篇
  8. 开机netmeeting已删除_NetMeeting
  9. PS常用快捷键大全(2020版)
  10. rk3288 android4.4,RK3288 Android4.4使用A6212,wifi可以用但是蓝牙起不来
  11. 互联网行业的那些缩写PM,RD,FE,UE,QA,OP,BRD,MRD,PRD,FSD
  12. Python一对一题目辅导「PTA 题目讲解·难度系数:基础」
  13. webpack4.0 css压缩js压缩 css 样式添加前缀
  14. 分析智联招聘的API接口,进行数据爬取
  15. Android Fragment 使用解析
  16. Eth 2.0 会成为第一个从 PoW转PoS 的公链吗?丨SheKnows第五期
  17. 185. [USACO Oct08] 挖水井
  18. Man Is Here For The Sake of Other Men 人是为了别人而活着
  19. api 定位 微信小程序 精度_微信小程序3种位置API的使用方法详解
  20. 一天半辛苦的搞机过程

热门文章

  1. tkinter 布局_第八弹:读者问有tkinter的资料吗?
  2. jenkins自动化打包部署,jenkins执行sh脚本不退出问题
  3. LeetCode 12 整数转罗马数字
  4. 快速排序(Quick_Sort)
  5. 【笔记】opencv的python实现·像素处理 像素访问 alpha通道
  6. 2021暑假生产实习【SSM实习项目-超市积分管理系统】博客汇总表
  7. JavaWeb-综合案例(用户信息)-学习笔记05【分页查询功能】
  8. 阿里云服务器怎么去掉tomcat的8080端口
  9. Android 如何有效的解决内存泄漏的问题
  10. DAC MAC RBAC ABAC 权限系统的设计