为什么需要线程间的通信

多个线程并发执行时,在默认情况下CPU时随机切换线程的,当我们需要多个线程共同完成一件任务,并且

希望他们有规律的执行,那么多线程之间需要一些协调通信,以此来帮我们达到多线程共同操作一份数据。

如何保证线程间通信有效利用资源

多个线程在处理同一个资源,并且任务不同时,需要线程通信来帮助解决线程之间对同一个遍历的使用或操作

就是多个线程在操作同一份书时,避免对同一个共享变量的争夺,也就是我们需要通过一定的手段使各个线程能有效的利用

资源,这个手段就是等待唤醒机制

机制中用到的方法:

注意:

调用wait和notify方法需要注意的细节:

案例分析:生产者和消费者的问题

包子类

  1. public class BaoZi {
  2. public String pi;
  3. public String xian;
  4. public boolean flag =false;
  5. }

包子铺线程:‘

  1. public class BaoZiPu extends Thread{
  2. private BaoZi bz;
  3.  
  4. public BaoZiPu(BaoZi bz) {
  5. this.bz = bz;
  6. }
  7.  
  8. @Override
  9. public void run() {
  10. int count =0;
  11.  
  12. while (true){
  13. synchronized (bz){
  14. if (bz.flag == true){
  15. try {
  16. bz.wait();
  17. } catch (InterruptedException e) {
  18. e.printStackTrace();
  19. }
  20. }
  21. if(count%2 ==0){
  22. bz.pi="pi000";
  23. bz.xian="xian0000";
  24. }else {
  25. bz.pi="pi111";
  26. bz.xian="xian111";
  27. }
  28. count++;
  29. System.out.println("正在做"+bz.xian+bz.pi);
  30. try {
  31. Thread.sleep(300);
  32. } catch (InterruptedException e) {
  33. e.printStackTrace();
  34. }
  35. //做好包子,修改状态
  36. bz.flag = true;
  37. //叫醒吃饱人
  38. bz.notify();
  39. }
  40. }
  41.  
  42. }
  43. }

吃包子线程

  1. public class ChiBaoZI extends Thread{
  2. private BaoZi bz;
  3.  
  4. public ChiBaoZI(BaoZi bz){
  5. this.bz=bz;
  6. }
  7.  
  8. @Override
  9. public void run() {
  10. while (true){
  11. synchronized (bz){
  12. if (bz.flag == false){
  13. try {
  14. bz.wait();
  15. } catch (InterruptedException e) {
  16. e.printStackTrace();
  17. }
  18. }
  19.  
  20. //唤醒之后
  21. System.out.println("正在吃包子"+bz.pi+bz.xian);
  22. //修改包子状态:
  23. bz.flag = false;
  24. System.out.println("吃完了");
  25. System.out.println("+++++++++++++++++");
  26. bz.notify();//唤醒包子铺做包子
  27.  
  28. }
  29. }
  30. }
  31.  
  32. }

包子测试:

  1. public class BaoZiTest {
  2. public static void main(String[] args) {
  3. BaoZi bz = new BaoZi();
  4. new BaoZiPu(bz).start();
  5. new ChiBaoZI(bz).start();
  6. }
  7. }

结果

  1. 正在做xian0000pi000
  2. 正在吃包子pi000xian0000
  3. 吃完了
  4. +++++++++++++++++
  5. 正在做xian111pi111
  6. 正在吃包子pi111xian111
  7. 吃完了
  8. +++++++++++++++++
  9. 正在做xian0000pi000
  10. 正在吃包子pi000xian0000
  11. 吃完了
  12. +++++++++++++++++
  13. 正在做xian111pi111
  14. 正在吃包子pi111xian111
  15. 吃完了
  16. +++++++++++++++++
  17. 正在做xian0000pi000
  18. 正在吃包子pi000xian0000
  19. 吃完了

线程池

底层原理

合理利用线程的好处

  1. 减低资源消耗,减少创建和销毁线程的次数,每个工作线程都可以被重复里哟ing,可执行多个任务
  2.  
  3. 提高响应速度,当任务到达,可以不要等待线程的创建就能执行
  4.  
  5. 提高线程的客观理性,可以根据系统的可承受能力,调整线程池中工作线程的数目,防止因为消耗过渡的内存,从而把服务器累吧
  6.  
  7. 注意,每个线程需要大约1MB的内存,线程越多,消耗内存也越多

java中的线程池:

建立Runnable 接口的实现类

  1. public class RunnableImpl implements Runnable{
  2.  
  3. Lock l = new ReentrantLock();
  4. @Override
  5. public void run() {
  6. System.out.println(Thread.currentThread().getName());
  7.  
  8. }
  9. }

建立线程池并使用:

  1. public class DemoThreadPool {
  2. public static void main(String[] args) {
  3. ExecutorService es =Executors.newFixedThreadPool(2);
  4. es.submit(new RunnableImpl());
  5. es.submit(new RunnableImpl());
  6. es.submit(new RunnableImpl());
  7. //线程池会一直开启,使用完线程,会自动回收到线程池,线程可以继续被使用
  8. //一般不会销毁线程池
  9. }
  10. }

java-等待唤醒机制(线程中的通信)-线程池的更多相关文章

  1. 多线程之间的通信(等待唤醒机制、Lock 及其它线程的方法)

    一.多线程之间的通信. 就是多个线程在操作同一份数据, 但是操作的方法不同. 如: 对于同一个存储块,其中有两个存储位:name   sex, 现有两个线程,一个向其中存放数据,一个打印其中的数据. ...

  2. java之等待唤醒机制(线程之间的通信)

    线程间通信 概念:多个线程在处理同一个资源,但是处理的动作(线程的任务)却不相同.比如:线程A用来生成包子的,线程B用来吃包子的,包子可以理解为同一资源,线程A与线程B处理的动作,一个是生产,一个是消 ...

  3. 等待唤醒机制----线程池----lambda表达式

    1.等待唤醒机制 1.1线程间通信 概念:多个线程在处理同一个资源,但是处理的动作(线程的任务)却不相同. 比如:线程A用来生成包子的,线程B用来吃包子的,包子可以理解为同一资源,线程A与线程B处理的 ...

  4. JAVA之旅(十四)——静态同步函数的锁是class对象,多线程的单例设计模式,死锁,线程中的通讯以及通讯所带来的安全隐患,等待唤醒机制

    JAVA之旅(十四)--静态同步函数的锁是class对象,多线程的单例设计模式,死锁,线程中的通讯以及通讯所带来的安全隐患,等待唤醒机制 JAVA之旅,一路有你,加油! 一.静态同步函数的锁是clas ...

  5. Java 之 线程 —线程通信( 等待唤醒机制)

    一.线程间通信 概念:多个线程在处理同一资源,但是处理的动作(线程的任务)却不相同. 例如: 线程 A 用来生成包子的,线程 B 用来吃包子的,包子可以理解为同一资源,线程 A 与线程 B 处理的动作 ...

  6. Java多线程02(线程安全、线程同步、等待唤醒机制)

    Java多线程2(线程安全.线程同步.等待唤醒机制.单例设计模式) 1.线程安全 如果有多个线程在同时运行,而这些线程可能会同时运行这段代码.程序每次运行结果和单线程运行的结果是一样的,而且其他的变量 ...

  7. Java中的等待唤醒机制—至少50%的工程师还没掌握!

    这是一篇走心的填坑笔记,自学Java的几年总是在不断学习新的技术,一路走来发现自己踩坑无数,而填上的坑却屈指可数.突然发现,有时候真的不是几年工作经验的问题,有些东西即使工作十年,没有用心去学习过也不 ...

  8. java基础(27):线程安全、线程同步、等待唤醒机制

    1. 多线程 如果有多个线程在同时运行,而这些线程可能会同时运行这段代码.程序每次运行结果和单线程运行的结果是一样的,而且其他的变量的值也和预期的是一样的,就是线程安全的. 我们通过一个案例,演示线程 ...

  9. Java 中的等待唤醒机制透彻讲解

    线程的状态 首先了解一下什么是线程的状态,线程状态就是当线程被创建(new),并且启动(start)后,它不是一启动就进入了执行状态(run),也不是一直都处于执行状态. 这里说一下Java 的Thr ...

  10. java ->多线程_线程同步、死锁、等待唤醒机制

    线程安全 如果有多个线程在同时运行,而这些线程可能会同时运行这段代码.程序每次运行结果和单线程运行的结果是一样的,而且其他的变量的值也和预期的是一样的,就是线程安全的. l  我们通过一个案例,演示线 ...

随机推荐

  1. 【C# 线程】 atomic action原子操作|primitive(基元、原语)

    概念 原子操作(atomic action):也叫primitive(原语.基元),它是操作系统用语范畴.指由若干条指令组成的,用于完成一定功能的一个过程.  原语是由若干个机器指令构成的完成某种特定 ...

  2. Maven目录结构, war目录结构

    Maven目录结构 src/main/java 存放java servlet类文件 src/main/webapp 存放jsp文件 war目录结构 Maven web项目目录结构

  3. centos7 部署ansible

    Ansible默认采用SSH的方式管理客户端,基于python开发,由paramiko和PyYAMl 两个关键模块构建 支持非root用户管理,支持sudo ansible作用:通过使用ansible ...

  4. oj教程--链表

    链表.我们知道数组是一种通用的数据结构,能用来实现栈.队列等很多数据结构.而链表也是一种使用广泛的通用数据结构,它也可以用来作为实现栈.队列等数据结构的基础,基本上除非需要频繁的通过下标来随机访问各个 ...

  5. Java基础--序列化和反序列化

    作用:在很多应用中,需要对某些对象进行序列化,让它们离开内存空间,入住物理硬盘,以便长期保存.比如最常见的是Web服务器中的Session对象,当有 10万用户并发访问,就有可能出现10万个Sessi ...

  6. POJ2663,3420题解

    两道非常像的题,放到一起来写 题目大意:用若干2x1的砖去铺一个3xN的空间(POJ3420为4xN),问总共有多少种不同的铺法(POJ3420还要求结果对MOD求模). 思路:找规律.对于3xN的空 ...

  7. 进程&线程(一)——multiprocessing,threading

    本节内容为①进程线程的基础知识:②在Python的实现方法: 学习总结自: 一文看懂Python多进程与多线程编程(工作学习面试必读) - 知乎 multiprocessing 官方文档 1.进程线程 ...

  8. Spring Cloud Gateway actuator组建对外暴露RCE问题漏洞分析

    Spring Cloud gateway是什么? Spring Cloud Gateway是Spring Cloud官方推出的第二代网关框架,取代Zuul网关.网关作为流量的,在微服务系统中有着非常作 ...

  9. laravel8安装步骤

    网址: https://learnku.com/docs/laravel/8.x/installation/9354 安装: # 安装laravel composer create-project - ...

  10. think php 验证器及验证场景的使用

    1:在需要验证的模块名下建一个validate文件夹 ,文件夹下建议个验证的 名称   Goods.php 2:打开Goods.php <?php namespace app\api\valid ...