java-等待唤醒机制(线程中的通信)-线程池

为什么需要线程间的通信
多个线程并发执行时,在默认情况下CPU时随机切换线程的,当我们需要多个线程共同完成一件任务,并且
希望他们有规律的执行,那么多线程之间需要一些协调通信,以此来帮我们达到多线程共同操作一份数据。
如何保证线程间通信有效利用资源
多个线程在处理同一个资源,并且任务不同时,需要线程通信来帮助解决线程之间对同一个遍历的使用或操作
就是多个线程在操作同一份书时,避免对同一个共享变量的争夺,也就是我们需要通过一定的手段使各个线程能有效的利用
资源,这个手段就是等待唤醒机制

机制中用到的方法:

注意:

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

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

包子类
public class BaoZi {
    public String pi;
    public String xian;
    public   boolean flag =false;
}
包子铺线程:‘
public class BaoZiPu extends Thread{
    private BaoZi bz;
    public BaoZiPu(BaoZi bz) {
        this.bz = bz;
    }
    @Override
    public void run() {
        int count =0;
        while (true){
            synchronized (bz){
                if (bz.flag == true){
                    try {
                        bz.wait();
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
                if(count%2 ==0){
                    bz.pi="pi000";
                    bz.xian="xian0000";
                }else {
                    bz.pi="pi111";
                    bz.xian="xian111";
                }
                count++;
                System.out.println("正在做"+bz.xian+bz.pi);
                try {
                    Thread.sleep(300);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                //做好包子,修改状态
                bz.flag = true;
                //叫醒吃饱人
                bz.notify();
            }
        }
    }
}
吃包子线程
public class ChiBaoZI extends Thread{
    private BaoZi bz;
    public ChiBaoZI(BaoZi bz){
        this.bz=bz;
    }
    @Override
    public void run() {
        while (true){
            synchronized (bz){
                if (bz.flag == false){
                    try {
                        bz.wait();
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
                //唤醒之后
                System.out.println("正在吃包子"+bz.pi+bz.xian);
                //修改包子状态:
                bz.flag = false;
                System.out.println("吃完了");
                System.out.println("+++++++++++++++++");
                bz.notify();//唤醒包子铺做包子
            }
        }
    }
}
包子测试:
public class BaoZiTest {
    public static void main(String[] args) {
        BaoZi bz = new BaoZi();
        new BaoZiPu(bz).start();
        new ChiBaoZI(bz).start();
    }
}
结果
正在做xian0000pi000
正在吃包子pi000xian0000
吃完了
+++++++++++++++++
正在做xian111pi111
正在吃包子pi111xian111
吃完了
+++++++++++++++++
正在做xian0000pi000
正在吃包子pi000xian0000
吃完了
+++++++++++++++++
正在做xian111pi111
正在吃包子pi111xian111
吃完了
+++++++++++++++++
正在做xian0000pi000
正在吃包子pi000xian0000
吃完了
线程池

底层原理



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

建立Runnable 接口的实现类
public class RunnableImpl implements Runnable{
    Lock l = new ReentrantLock();
    @Override
    public void run() {
        System.out.println(Thread.currentThread().getName());
    }
}
建立线程池并使用:
public class DemoThreadPool {
    public static void main(String[] args) {
        ExecutorService es =Executors.newFixedThreadPool(2);
        es.submit(new RunnableImpl());
        es.submit(new RunnableImpl());
        es.submit(new RunnableImpl());
        //线程池会一直开启,使用完线程,会自动回收到线程池,线程可以继续被使用
        //一般不会销毁线程池
    }
}
java-等待唤醒机制(线程中的通信)-线程池的更多相关文章
- 多线程之间的通信(等待唤醒机制、Lock 及其它线程的方法)
		一.多线程之间的通信. 就是多个线程在操作同一份数据, 但是操作的方法不同. 如: 对于同一个存储块,其中有两个存储位:name sex, 现有两个线程,一个向其中存放数据,一个打印其中的数据. ... 
- java之等待唤醒机制(线程之间的通信)
		线程间通信 概念:多个线程在处理同一个资源,但是处理的动作(线程的任务)却不相同.比如:线程A用来生成包子的,线程B用来吃包子的,包子可以理解为同一资源,线程A与线程B处理的动作,一个是生产,一个是消 ... 
- 等待唤醒机制----线程池----lambda表达式
		1.等待唤醒机制 1.1线程间通信 概念:多个线程在处理同一个资源,但是处理的动作(线程的任务)却不相同. 比如:线程A用来生成包子的,线程B用来吃包子的,包子可以理解为同一资源,线程A与线程B处理的 ... 
- JAVA之旅(十四)——静态同步函数的锁是class对象,多线程的单例设计模式,死锁,线程中的通讯以及通讯所带来的安全隐患,等待唤醒机制
		JAVA之旅(十四)--静态同步函数的锁是class对象,多线程的单例设计模式,死锁,线程中的通讯以及通讯所带来的安全隐患,等待唤醒机制 JAVA之旅,一路有你,加油! 一.静态同步函数的锁是clas ... 
- Java 之 线程 —线程通信( 等待唤醒机制)
		一.线程间通信 概念:多个线程在处理同一资源,但是处理的动作(线程的任务)却不相同. 例如: 线程 A 用来生成包子的,线程 B 用来吃包子的,包子可以理解为同一资源,线程 A 与线程 B 处理的动作 ... 
- Java多线程02(线程安全、线程同步、等待唤醒机制)
		Java多线程2(线程安全.线程同步.等待唤醒机制.单例设计模式) 1.线程安全 如果有多个线程在同时运行,而这些线程可能会同时运行这段代码.程序每次运行结果和单线程运行的结果是一样的,而且其他的变量 ... 
- Java中的等待唤醒机制—至少50%的工程师还没掌握!
		这是一篇走心的填坑笔记,自学Java的几年总是在不断学习新的技术,一路走来发现自己踩坑无数,而填上的坑却屈指可数.突然发现,有时候真的不是几年工作经验的问题,有些东西即使工作十年,没有用心去学习过也不 ... 
- java基础(27):线程安全、线程同步、等待唤醒机制
		1. 多线程 如果有多个线程在同时运行,而这些线程可能会同时运行这段代码.程序每次运行结果和单线程运行的结果是一样的,而且其他的变量的值也和预期的是一样的,就是线程安全的. 我们通过一个案例,演示线程 ... 
- Java 中的等待唤醒机制透彻讲解
		线程的状态 首先了解一下什么是线程的状态,线程状态就是当线程被创建(new),并且启动(start)后,它不是一启动就进入了执行状态(run),也不是一直都处于执行状态. 这里说一下Java 的Thr ... 
- java ->多线程_线程同步、死锁、等待唤醒机制
		线程安全 如果有多个线程在同时运行,而这些线程可能会同时运行这段代码.程序每次运行结果和单线程运行的结果是一样的,而且其他的变量的值也和预期的是一样的,就是线程安全的. l 我们通过一个案例,演示线 ... 
随机推荐
- 【C#基础概念】字节顺序(大端、小端)
			字节顺序,又称端序或尾序(英語:Endianness),在计算机科学领域中,指電腦記憶體中或在数字通信链路中,组成多字节的字的字节的排列顺序. 例如假设上述变量x类型为int,位于地址0x100处,它 ... 
- shell脚本编写自动启动服务方法
			shell脚本编写自动启动服务方法 前言 ln :创建连接文件 默认创建的是硬连接,好比复制 ,但是两个文件会同步命令:ln ./java/android/aa.txt aaa s :创建的是软连接变 ... 
- linux基础-jdk1.8和weblogic12.2.1.3.0安装
			转至:https://www.cnblogs.com/jiarui-zjb/p/9642416.html 1.环境探查与准备 安装jdk和weblogic前需要对进行安装的linux系统硬件和软件环境 ... 
- Java 实现Https访问工具类 跳过ssl证书验证
			不多BB ,代码直接粘贴可用 import java.io.BufferedReader; import java.io.ByteArrayOutputStream; import java.io.F ... 
- JZ-055-链表中环的入口结点
			链表中环的入口结点 题目描述 给一个链表,若其中包含环,请找出该链表的环的入口结点,否则,输出null. 题目链接: 链表中环的入口结点 代码 import java.util.ArrayList; ... 
- thinkphp 添加数据
			....控制器方法返回视图 public function create() { // return view(); } ...............表单页面 <!DOCTYPE html&g ... 
- tensorflow源码解析之framework拾遗
			把framework中剩余的内容,按照文件名进行了简单解析.时间原因写的很仓促,算是占个坑,后面有了新的理解再来补充. allocation_description.proto 一个对单次内存分配结果 ... 
- 自己动手写Vector【Cherno C++教程】
			动手写一个Vector 本文是对<最好的C++教程>的动手写数据结构部分的一个整理,主要包含91p动手写Array数组和92p动手写Vector数组的内容. 自己动手来写这些数据结构是学习 ... 
- Java运算符 算术运算法
			运算符 算术运算法:+,-,*,/,%,++,– 复制运算符:= 关系运算符:>,<,>=,<=,==,!= instanceof 逻辑运算符:&&,||,! ... 
- CF1278F题解
			这不是傻逼题吗?????? 考虑到第一张是王牌的概率为 \(\frac{1}{m}\),答案就是: \[\sum_{i=0}^n\binom{n}{i}(\frac{1}{m})^i(1-\frac{ ... 
