线程间通信

概念:多个线程在处理同一个资源,但是处理的动作(线程的任务)却不相同
重点:有效的利用资源

分析:需要那些类

1 资源类:包子类

  • 设置包子的属性
  • 包子的状态:有true 没有false

2 生产者(包子铺)类:是一个线程类,可以继承Thread

  • 设置线程任务(run):生产包子
  • 对包子的状态进行判断

true:有包子

  • 包子铺调用wait方法进入等待状态

false:没有包子

  • 包子铺生产包子
  • 增加一些多样性:交替生产两种包子
  • 有两种状态(i%2 == 0 )
  • 包子铺生产好了包子
  • 修改包子的状态为true有
  • 唤醒吃货线程,让吃货线程吃包子

3 消费者(吃货)类:是一个线程类,可以继承Thread

  • 设置线程任务(run):吃包子
  • 对包子的状态进行判断

false:没有包子

  • 吃货线程调用wait方法进入等待状态

true:有包子

  • 吃货吃包子
  • 吃货吃完包子
  • 修改包子的状态为false没有
  • 吃货唤醒包子铺线程,生产包子

4 测试类:

  • 包含main方法,程序执行的入口,启动程序
  • 创建包子对象:
  • 创建包子铺线程,开启,生产包子
  • 创建吃货线程,开启,吃包子;

注意:

  • 包子铺线程和包子线程关系-->通信(互斥)、
  • 必须同时同步技术保证两个线程只能有一个在执行
  • 锁对象必须保证唯一,可以使用包子对象作为锁对象
  • 包子铺类和吃货的类就需要把包子对象作为参数传递进来
    1. 需要在成员位置创建一个包子变量
    2. 使用带参数的构造方法,为这个包子变量赋值
public class CaiNiao{
public static void main(String[] args){
//创建锁对象,保证唯一
Object obj = new Object();
//创建一个顾客线程(消费者)
new Thread(){
@Override
public void run(){
//一直等着买包子
while(true){
//保证等待和唤醒的线程只能有一个执行,需要使用同步技术
syncharonized (obj){
System.out.println("告知老板要的包子的种类和数量");
//调用wait方法,放弃cpu的执行,进入到WAITNG状态(无限等待)
try{
obj.wait();
}catch (InterruptedException e){
e.printStackTrace();
}
//唤醒之后执行的代码
System.out.println("包子已经做好了,开吃!");
System.out.println("--------------");
}
}
}
}.start(); //创建一个老板线程(生产者)
new Thread(){
@Override
public void run(){
//一直做包子
while(true){
//花5秒做包子
try{
Thread.sleep(5000);//花5秒做包子
}catch(InterruptedException e);
e.printStackTrace();
}
//保证等待和唤醒只能有一个在执行,需要使用同步技术
syncharonized (obj){
System.out.println("花了5秒做包子,做好包子之后,调用notify方法,唤醒顾客吃包子");
//做好包子之后,调用notify方法,唤醒顾客吃包子
obj.notify();
}
}
}.start();
}

Java学习:线程间通信的更多相关文章

  1. Java多线程——线程间通信

    Java多线系列文章是Java多线程的详解介绍,对多线程还不熟悉的同学可以先去看一下我的这篇博客Java基础系列3:多线程超详细总结,这篇博客从宏观层面介绍了多线程的整体概况,接下来的几篇文章是对多线 ...

  2. Java并发——线程间通信与同步技术

    传统的线程间通信与同步技术为Object上的wait().notify().notifyAll()等方法,Java在显示锁上增加了Condition对象,该对象也可以实现线程间通信与同步.本文会介绍有 ...

  3. 【转】Java学习---线程间的通信

    [原文]https://www.toutiao.com/i6572378564534993415/ 两个线程间的通信 这是我们之前的线程. 执行效果:谁抢到资源,谁运行~ 实现线程交替执行: 这里主要 ...

  4. Java多线程:线程间通信之volatile与sychronized

    由前文Java内存模型我们熟悉了Java的内存工作模式和线程间的交互规范,本篇从应用层面讲解Java线程间通信. Java为线程间通信提供了三个相关的关键字volatile, synchronized ...

  5. Java 里如何实现线程间通信

    正常情况下,每个子线程完成各自的任务就可以结束了.不过有的时候,我们希望多个线程协同工作来完成某个任务,这时就涉及到了线程间通信了. 本文涉及到的知识点:thread.join(), object.w ...

  6. Java 如何实现线程间通信

    正常情况下,每个子线程完成各自的任务就可以结束了.不过有的时候,我们希望多个线程协同工作来完成某个任务,这时就涉及到了线程间通信了. 本文涉及到的知识点: thread.join(), object. ...

  7. 有多少人在面试时,被Java 如何线程间通讯,问哭了?

    正常情况下,每个子线程完成各自的任务就可以结束了.不过有的时候,我们希望多个线程协同工作来完成某个任务,这时就涉及到了线程间通信了. 本文涉及到的知识点: thread.join(), object. ...

  8. Java多线程学习(五)线程间通信知识点补充

    系列文章传送门: Java多线程学习(二)synchronized关键字(1) Java多线程学习(二)synchronized关键字(2) Java多线程学习(三)volatile关键字 Java多 ...

  9. 0038 Java学习笔记-多线程-传统线程间通信、Condition、阻塞队列、《疯狂Java讲义 第三版》进程间通信示例代码存在的一个问题

    调用同步锁的wait().notify().notifyAll()进行线程通信 看这个经典的存取款问题,要求两个线程存款,两个线程取款,账户里有余额的时候只能取款,没余额的时候只能存款,存取款金额相同 ...

随机推荐

  1. python3 内建函数filter

    Python内建的filter()函数用于过滤序列. 和map()类似,filter()也接收一个函数和一个序列.和map()不同的是,filter()把传入的函数依次作用于每个元素,然后根据返回值是 ...

  2. 使用XDocReport将HTML格式数据转换为Word

    文档地址:https://github.com/opensagres/xdocreport/wiki/DocxReportingQuickStart 本文采用XDocReport集合Freemaike ...

  3. ORACLE百分比分析函数RATIO_TO_REPORT() OVER()

    有时候不用的指标的绝对值不能比,但是转转为百分比的形式就容易看出波动了,是数据分析的好用的一个分析函数 20:00:24 SYS@orcl> conn scott/tiger; Connecte ...

  4. sqlalchemy相关操作(ORM)

    环境:python3.7,pycharm,mysql ORM(Object-Relational-Mapper) 对象关系映射(ORM)是一种允许您使用面向对象的范例从数据库查询和操作数据的技术,sq ...

  5. MySQL使用alter修改表的结构

    SQL语句     DLL        数据定义语言         create,drop     DML     数据操纵语言         insert,delete,select,upda ...

  6. mac下sourcetree创建git分支和合并分支

    git默认创建的分支为:master主分支 要实现的效果:新建和合并分支. 1.在master基础上创建分支v1.0.1并切换至v1.0.1然后推送分支到远程服务器 确定即可!! 然后查看远端已经发现 ...

  7. ZABBIX监控TCP连接状态

    一.获取监控数据 # /bin/netstat -an|awk '/^tcp/{++S[$NF]}END{for(a in S) print a,S[a]}' LISTEN ESTABLISHED T ...

  8. HDU6583:Typewriter(dp+后缀自动机)

    传送门 题意: 给出\(p,q\),现在要你生成一个字符串\(s\). 你可以进行两种操作:一种是花费\(p\)的代价随意在后面添加一个字符,另一种是花费\(q\)的代价可以随意赋值前面的一个子串. ...

  9. 编译rabbitmq c++客户端

    rabbitmq官网地址 rabbitmq客户端 c++版本地址 rabbitmq客户端 c版本地址 下载c++版本:根据编译说明 Pre-requisites boost-1.47.0 or new ...

  10. date命令的FORMAT中输入空格的几种方法

    1.date +%Y-%m-%d\ (一个空格)%H:%M:%S 此命令中用了转义字符 \ ,将空格转义出来 2.date +%Y-%m-%d'  '%H:%M:%S 此命令中的单引号内可以是一个或多 ...