线程和进程:

进程: 一个程序,是执行程序的一次执行过程。

一个进程往往包含若干个线程,线程是cpu调度和执行的单位。

Java默认有2个线程:main、GC

池化技术:

  01:程序的运行,本质 :占用系统的资源! 优化资源的使用!  =>池化技术02:线程池、连接池、内存池、对象池///......创建、销毁。 十分浪费资源03:池化技术:事先准备好一些资源,有人要用,就来我这里拿,用完之后还给我。

线程池的好处:
  01:降低资源的消耗
  02:提高响应的速度
  03:方便管理
  (重点)线程复用、可以控制最大并发数、管理线程

线程池三大方法:

  1. Executors.newSingleThreadExecutor() 单个线程

  1. newFixedThreadPool(int nThreads)  创建一个固定的线程池的大小


运行结果:
最高同时有5个线程在执行!

  1. newCachedThreadPool()      大小可伸缩的缓冲池
package threadPool;import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;public class Test01 {public static void main(String[] args) {// ExecutorService threadExecutor = Executors.newSingleThreadExecutor();//单线程// ExecutorService threadExecutor1 = Executors.newFixedThreadPool(5);//创建一个固定大小的线程池ExecutorService threadExecutor2 = Executors.newCachedThreadPool();//可以伸缩大小的线程池try {for (int i = 0; i < 10; i++) {//使用了线程池之后,使用线程池来创建线程threadExecutor2.execute(() -> {System.out.println(Thread.currentThread().getName() + "执行!");});}} catch (Exception e) {e.printStackTrace();} finally {//为了确保关闭,放在finally里面threadExecutor2.shutdown();//线程池用完,程序结束,关闭线程池}}
}

运行结果:

七大参数:

                                  ******7大参数原码分析******public ThreadPoolExecutor(int corePoolSize,           //核心线程池大小int maximumPoolSize,                  //最大核心线程池大小long keepAliveTime,                   //超时了没有人调用就会释放TimeUnit unit,                        //超时单位BlockingQueue<Runnable> workQueue,    //阻塞队列ThreadFactory threadFactory,          //线程工厂,创建线程的,一般不用动RejectedExecutionHandler handler) {   //拒绝策略if (corePoolSize < 0 ||maximumPoolSize <= 0 ||maximumPoolSize < corePoolSize ||keepAliveTime < 0)throw new IllegalArgumentException();if (workQueue == null || threadFactory == null || handler == null)throw new NullPointerException();                 this.corePoolSize = corePoolSize;this.maximumPoolSize = maximumPoolSize;this.workQueue = workQueue;this.keepAliveTime = unit.toNanos(keepAliveTime);this.threadFactory = threadFactory;this.handler = handler;}

自定义线程池:

public class Test02 {public static void main(String[] args) {ThreadPoolExecutor threadPoolExecutor=new  ThreadPoolExecutor(2,5,3,TimeUnit.SECONDS,new LinkedBlockingDeque<>(3),Executors.defaultThreadFactory(),new ThreadPoolExecutor.AbortPolicy());try {for (int i = 0; i < 9; i++) {//使用了线程池之后,使用线程池来创建线程threadPoolExecutor.execute(() -> {System.out.println(Thread.currentThread().getName() + "执行!");});}} catch (Exception e) {e.printStackTrace();} finally {//为了确保关闭,放在finally里面threadPoolExecutor.shutdown();//线程池用完,程序结束,关闭线程池}}
}

当人数超过阻塞队列加最大核心线程池大小时触发拒绝策略,会抛出异常。

四种拒绝策略:


图示理解拒绝策略:

举例,银行共有5个窗口(最大线程数),有常开的两个窗口处理业务(核心线程数);候客区(阻塞队列)有三个位置;当两个常开窗口(核心线程)以及候客区(阻塞队列)的位置都有人后,再来客户会开启另外三个窗口;当5个窗口(最大线程)和候客区(阻塞队列)都有人后,再来客户会启动拒绝策略。当窗口(线程)超过设定时间(超时时间)没有业务办理时(未调用)会关闭窗口(释放线程)。

  1. new ThreadPoolExecutor.AbortPolicy() (默认拒绝策略)银行满了,还有人进来,不处理这个人的,抛出异常
  2. new ThreadPoolExecutor.CallerRunsPolicy() 哪来的去哪里!

  1. new ThreadPoolExecutor.DiscardPolicy() 队列满了,丢掉任务,不会抛出异常!

  2. new ThreadPoolExecutor.DiscardOldestPolicy() 队列满了,尝试和最早的竞争,也不会抛出异常

线程池三大方法,七大参数,四种拒绝策略相关推荐

  1. 线程池的四种拒绝策略

    一.前言 线程池,相信很多人都有用过,没用过相信的也有学习过.但是,线程池的拒绝策略,相信知道的人会少许多. 二.四种线程池拒绝策略 当线程池的任务缓存队列已满并且线程池中的线程数目达到maximum ...

  2. 线程池中的七大参数(三)

    线程池中的七大参数如下: (1)corePoolSize:线程池中的常驻核心线程数. (2)maximumPoolSize:线程池能够容纳同时执行的最大线程数,此值大于等于1. (3)keepAliv ...

  3. 关于线程池的五种实现方式,七大参数,四种拒绝策略

    一.池化技术之线程池 实现线程池视频讲解,附源码:「链接」 什么是池化技术?简单来说就是优化资源的使用,我准备好了一些资源,有人要用就到我这里拿,用完了就还给我.而一个比较重要的的实现就是线程池.那么 ...

  4. 线程池ThreadPoolExecutor的七大参数

    七个参数的构造方法如下 public ThreadPoolExecutor(int corePoolSize,int maximumPoolSize,long keepAliveTime,TimeUn ...

  5. C#中方法的参数四种类型(值参数、ref、out、params)详解

    看公司程序偶然看到ref引用,于是查找一了番,现整理如下: 1. 值参数 (不加任何修饰符,是默认的类型)       2. 引用型参数 (以ref 修饰符声明)       3. 输出参数 (以ou ...

  6. Java多线程学习七:线程池的 4 种拒绝策略和 6 种常见的线程池

    以便在必要的时候按照我们的策略来拒绝任务,那么拒绝任务的时机是什么呢?线程池会在以下两种情况下会拒绝新提交的任务. 第一种情况是当我们调用 shutdown 等方法关闭线程池后,即便此时可能线程池内部 ...

  7. 线程池ThreadPool,线程池底层ThreadPoolExecutor方法七大参数,拒绝策略,以及实际开发中高并发下用到哪个线程池?

    为什么要用线程池 基本的三个线程池的底层就是ThreadPoolExecutor类 ExecutorService threadPool = Executors.newFixedThreadPool( ...

  8. 线程池:4个方法,7个参数,4种拒绝策略

    什么是池? 先讲一个例子,有可能可以帮助你理解,觉得无趣的小伙伴可以直接跳过.相信大多数都知道外包公司,甚至很多小伙伴还在外包公司呆过,其实外包公司我觉得也就可以看作是个"池". ...

  9. 击穿线程池面试题:3大方法,7大参数,4种拒绝策略

    前言:多线程知识是Java面试中必考的点.本文详细介绍--线程池.在实际开发过程里,很多IT从业者使用率不高,也只是了解个理论知识,和背诵各种八股文,没有深入理解到脑海里,导致面试完就忘.--码农 = ...

最新文章

  1. ES6中定义的类和对象
  2. CentosMySQL5.6安装方法
  3. ssdt 表结构及hook的一般理解
  4. Linux资料分享,强势来袭!
  5. / 卡路里_最大卡路里
  6. 虚拟运营商人工服务器,四大必想之事:倒闭、价格、网络
  7. 操作 mysql 不生成日志_详解MySQL的日志
  8. linux iphone文件,在linux下生成iphone所需要的视频和音频文件的方法总结
  9. 最好用的mysql密码忘记的解决方法
  10. bash脚本编程之条件判断、条件测试
  11. net.java.html.boot.BrowserBuilder
  12. discuz清空session,导致session保存机制失败,session无法更新与解决
  13. uiswitch样式_iOS - UISwitch 、UISegmentedControl
  14. css 纯颜色叠加,CSS颜色叠加
  15. 8项引导技能在Scrum中的应用
  16. Difference between Static video and Single image ?静态视频和单张图像的区别
  17. Torts and Personal Injury
  18. HDU1302——蜗牛爬井(注意使用float)
  19. fortify源代码扫描问题分析汇总
  20. 什么是HashMap

热门文章

  1. AI在华东金融专场 | 腾讯云核心伙伴进阶营走进上海
  2. [编程工具]使用NPIO(C#)读取xls,xlsx(Excel)表格
  3. WEB安全的防御--介绍XSS跨网站脚本[wiki]
  4. 攻防世界János-the-Ripper
  5. 7.7 竞赛题目选讲
  6. Windows操作系统:串口篇
  7. 安卓ClickableSpan修改超链接样式
  8. 排序算法10——图解基数排序(次位优先法LSD和主位优先法MSD)
  9. 很不错的Spring学习笔记
  10. maven获得dom4j_关于dom4j在maven中的使用