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# 线程】 atomic action原子操作|primitive(基元、原语)
概念 原子操作(atomic action):也叫primitive(原语.基元),它是操作系统用语范畴.指由若干条指令组成的,用于完成一定功能的一个过程. 原语是由若干个机器指令构成的完成某种特定 ...
- Maven目录结构, war目录结构
Maven目录结构 src/main/java 存放java servlet类文件 src/main/webapp 存放jsp文件 war目录结构 Maven web项目目录结构
- centos7 部署ansible
Ansible默认采用SSH的方式管理客户端,基于python开发,由paramiko和PyYAMl 两个关键模块构建 支持非root用户管理,支持sudo ansible作用:通过使用ansible ...
- oj教程--链表
链表.我们知道数组是一种通用的数据结构,能用来实现栈.队列等很多数据结构.而链表也是一种使用广泛的通用数据结构,它也可以用来作为实现栈.队列等数据结构的基础,基本上除非需要频繁的通过下标来随机访问各个 ...
- Java基础--序列化和反序列化
作用:在很多应用中,需要对某些对象进行序列化,让它们离开内存空间,入住物理硬盘,以便长期保存.比如最常见的是Web服务器中的Session对象,当有 10万用户并发访问,就有可能出现10万个Sessi ...
- POJ2663,3420题解
两道非常像的题,放到一起来写 题目大意:用若干2x1的砖去铺一个3xN的空间(POJ3420为4xN),问总共有多少种不同的铺法(POJ3420还要求结果对MOD求模). 思路:找规律.对于3xN的空 ...
- 进程&线程(一)——multiprocessing,threading
本节内容为①进程线程的基础知识:②在Python的实现方法: 学习总结自: 一文看懂Python多进程与多线程编程(工作学习面试必读) - 知乎 multiprocessing 官方文档 1.进程线程 ...
- Spring Cloud Gateway actuator组建对外暴露RCE问题漏洞分析
Spring Cloud gateway是什么? Spring Cloud Gateway是Spring Cloud官方推出的第二代网关框架,取代Zuul网关.网关作为流量的,在微服务系统中有着非常作 ...
- laravel8安装步骤
网址: https://learnku.com/docs/laravel/8.x/installation/9354 安装: # 安装laravel composer create-project - ...
- think php 验证器及验证场景的使用
1:在需要验证的模块名下建一个validate文件夹 ,文件夹下建议个验证的 名称 Goods.php 2:打开Goods.php <?php namespace app\api\valid ...