一、线程池

1.线程间通信

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

2.等待唤醒机制

什么是等待唤醒机制
这是多个线程间的⼀种协作机制。
谈到线程我们经常想到的是线程间的竞争( race ),⽐如去争夺锁,但这并不是故事的全部,线程间也会有协作机制。就是在⼀个线程进⾏了规定操作后,就进⼊等待状态( wait() ),等待其他线程执⾏完他们的指定代码过后再将其唤醒( notify() );在有多个线程进⾏等待时,如果需要,可以使⽤ notifyAll() 来 唤醒所有的等待线程。 wait/notify 就是线程间的⼀种协作机制。
等待唤醒中的⽅法
等待唤醒机制就是⽤于解决线程间通信的问题的,使⽤到的3个⽅法的含义如下:
1. wait:线程不再活动,不再参与调度,进⼊ wait set 中,因此不会浪费 CPU 资源,也不会
去竞争锁了,这时的线程状态即是 WAITING。它还要等着别的线程执⾏⼀个特别的动作
也即是通知( notify )”在这个对象上等待的线程从 wait set 中释放出来,重新进⼊到调度队
列( ready queue )中。
2. notify:则选取所通知对象的 wait set 中的⼀个线程释放;例如,餐馆有空位置后,等候就
餐最久的顾客最先⼊座。
3. notifyAll:则释放所通知对象的 wait set 上的全部线程。
调⽤wait和notify⽅法需要注意的细节
1. wait⽅法与notify⽅法必须要由同⼀个锁对象调⽤。因为:对应的锁对象可以通过notify唤醒
使⽤同⼀个锁对象调⽤的wait⽅法后的线程。
2. wait⽅法与notify⽅法是属于Object类的⽅法的。因为:锁对象可以是任意对象,⽽任意对
象的所属类都是继承了Object类的。
3. wait⽅法与notify⽅法必须要在同步代码块或者是同步函数中使⽤。因为:必须要通过锁对
象调⽤这2个⽅法。

生产者与消费者问题:等待唤醒机制其实就是经典的“⽣产者与消费者”的问题。

3.有关线程池

线程池:其实就是⼀个容纳多个线程的容器,其中的线程可以反复使⽤,省去了频繁创建线程对象的操作,⽆需反复创建线程⽽消耗过多资源。

合理利⽤线程池能够带来三个好处:
1. 降低资源消耗。减少了创建和销毁线程的次数,每个⼯作线程都可以被重复利⽤,可执⾏多个任务。
2. 提⾼响应速度。当任务到达时,任务可以不需要的等到线程创建就能⽴即执⾏。
3. 提⾼线程的可管理性。可以根据系统的承受能⼒,调整线程池中⼯作线线程的数⽬,防⽌因为消耗过多的内存,⽽把服务器累趴下(每个线程需要⼤约1MB内存,线程开的越多,消耗的内存也就越⼤,最后死机)。

1.线程池的使用

Java⾥⾯线程池的顶级接⼝是 java.util.concurrent.Executor ,但是严格意义上讲 Executor并不是⼀个线程池,⽽只是⼀个执⾏线程的⼯具。
真正的线程池接⼝是java.util.concurrent.ExecutorService 。要配置⼀个线程池是⽐较复杂的,尤其是对于线程池的原理不是很清楚的情况下,很有可能配置的线程池不是较优 的,因此在 java.util.concurrent.Executors 线程⼯⼚类⾥⾯提供了⼀些静态⼯⼚,⽣成⼀些常⽤的线程池。官 ⽅建议使⽤ Executors ⼯程类来创建线程池对象。
Executors 类中有个创建线程池的⽅法如下:
public static ExecutorService newFixedThreadPool(int nThreads) :返回线程池对象。(创建的是有界线程池,也就是池中的线程个数可以指定最⼤数量)
获取到了⼀个线程池 ExecutorService 对象,那么怎么使⽤呢,在这⾥定义了⼀个使⽤线程池对
象的⽅法如下:
public Future<?> submit(Runnable task) :获取线程池中的某⼀个线程对象,并执⾏

(Future接⼝:⽤来记录线程任务执⾏完毕后产⽣的结果。线程池创建与使⽤)
使⽤线程池中线程对象的步骤:
1. 创建线程池对象。
2. 创建Runnable接⼝⼦类对象。(task)
3. 提交Runnable接⼝⼦类对象。(take task)
4. 关闭线程池(⼀般不做)。

JAVA day27,28 线程池相关推荐

  1. Java并发编程——线程池的使用

    在前面的文章中,我们使用线程的时候就去创建一个线程,这样实现起来非常简便,但是就会有一个问题: 如果并发的线程数量很多,并且每个线程都是执行一个时间很短的任务就结束了,这样频繁创建线程就会大大降低系统 ...

  2. Java常用四大线程池用法以及ThreadPoolExecutor详解

    2019独角兽企业重金招聘Python工程师标准>>> 为什么用线程池? 1.创建/销毁线程伴随着系统开销,过于频繁的创建/销毁线程,会很大程度上影响处-理效率 2.线程并发数量过多 ...

  3. 四十七、面试前,必须搞懂Java中的线程池ThreadPoolExecutor(上篇)

    @Author:Runsen @Date:2020/6/9 人生最重要的不是所站的位置,而是内心所朝的方向.只要我在每篇博文中写得自己体会,修炼身心:在每天的不断重复学习中,耐住寂寞,练就真功,不畏艰 ...

  4. java异常_Java线程池「异常处理」正确姿势:有病就得治

    假设我们有一个线程池,由于程序需要,我们向该线程池中提交了好多好多任务,但是 这些任务都没有对异常进行try catch处理,并且运行的时候都抛出了异常 .这会对线程池的运行带来什么影响? 正确答案是 ...

  5. 自定义线程池-java内置线程池构造方法介绍

    Java内置线程池原理剖析 我们要想自定义线程池,必须先了解线程池的工作原理,才能自己定义线程池:这里我们通过观察java中ThreadPoolExecutor的源码来学习线程池的原理; Thread ...

  6. Java多线程之线程池配置合理线程数

    Java多线程之线程池配置合理线程数 目录 代码查看公司服务器或阿里云是几核的 合理线程数配置之CPU密集型 合理线程数配置之IO密集型 1. 代码查看公司服务器或阿里云是几核的 要合理配置线程数首先 ...

  7. Java多线程之线程池的手写改造和拒绝策略

    Java多线程之线程池的手写改造和拒绝策略 目录 自定义线程池的使用 四种拒绝策略代码体现 1. 自定义线程池的使用 自定义线程池(拒绝策略默认AbortPolicy) public class My ...

  8. Java多线程之线程池7大参数、底层工作原理、拒绝策略详解

    Java多线程之线程池7大参数详解 目录 企业面试题 线程池7大参数源码 线程池7大参数详解 底层工作原理详解 线程池的4种拒绝策略理论简介 面试的坑:线程池实际中使用哪一个? 1. 企业面试题 蚂蚁 ...

  9. Java多线程之线程池详解

    Java多线程之线程池详解 目录: 线程池使用及优势 线程池3个常用方式 线程池7大参数深入介绍 线程池底层工作原理 1. 线程池使用及优势 线程池做的工作主要是控制运行的线程的数量,处理过程中将任务 ...

  10. java workerdone_【架构】Java并发编程——线程池的使用

    前言 如果我们要使用线程的时候就去创建一个,这样虽然非常简便,但是就会有一个问题: 如果并发的线程数量很多,并且每个线程都是执行一个时间很短的任务就结束了,这样频繁创建线程就会大大降低系统的效率,因为 ...

最新文章

  1. 【Java】枚举(enum)机制 详解
  2. 那些想坐等AI成熟再采用的公司,可能永远也跟不上AI浪潮
  3. mysql 常用命令 | 表间 弱关联 join
  4. centos7标准版命令界面和图形界面相互切换
  5. mysql里b树_MySQL-B树/B+树
  6. PaddleHub教程合集
  7. css实现背景颜色透明,文字不透明
  8. python第一个程序--hello world
  9. 5.4(将英里转化位千米)
  10. 学习yaf(二) 使用Bootstrap
  11. 西门子PLC S7-1200程序实例,博图版本V15,仅供电气编程者学习借鉴
  12. pm2同时启动多个前端项目
  13. Linux头文件 C/C++头文件
  14. 智能音箱音效哪个好_智能音箱这么多,哪个智能音箱,才是现在最好的
  15. QT读写文本文件编码设置
  16. 抖音账号如何做好私域流量,私域流量是什么
  17. springboot ruoyi
  18. 在vue3中使用jsx语法
  19. 使用JOSM绘制室内地图及路径(一)
  20. 小心!FOMO3D的坑

热门文章

  1. SpringBoot Serverless 实战 | 监控调试
  2. oracle用exp定时备份数据库,使用exp和imp对Oracle数据库进行简单的备份
  3. 真假黄仁勋疑云?英伟达推出全球首个元宇宙平台
  4. “我们的边缘计算技术点,可能超前了业界一点”
  5. 乌镇百度大脑开放日召开,重磅发布“乘风人脸通行考勤平台”
  6. JavaScript 虽火,但不要轻易去追随!
  7. SpaceX 火箭发射成功,一文了解所用的软件技术栈!
  8. 一文带你认清数据仓库“维度模型设计”与“分层架构” | 原力计划
  9. 几十秒构建端到端 AI,NeurIPS 2020 AutoDL 竞赛夺冠“黑马”原来靠的是这门技术!...
  10. “生命游戏之父”因新冠肺炎逝世,回顾数学顽童的一生