首页 > 编程语言 >Java:谈谈线程池的使用?

Java:谈谈线程池的使用?

时间:2023-04-20 23:44:23浏览次数:40  
标签:内置 Java 队列 任务 谈谈 线程 new ThreadPoolExecutor

简介

线程池是一种利用池化技术思想来实现的线程管理技术,主要是为了复用线程、便利地管理线程和任务、并将线程的创建和任务的执行解耦开来。

核心参数

  1、核心线程数

  2、最大线程数

  3、空闲线程最大存活时间

  4、时间单位

  5、线程等待队列

  5、线程工厂

  6、饱和策略

 

饱和策略

1、ThreadPoolExecutor.AbortPolicy:丢弃任务并抛出RejectedExecutionException异常。 【默认】

2、ThreadPoolExecutor.DiscardPolicy:丢弃任务,但是不抛出异常。

3、ThreadPoolExecutor.DiscardOldestPolicy:丢弃线程队列的中最先进来的任务,将新的任务添加到队列中。

4、ThreadPoolExecutor.CallerRunsPolicy:由调用线程来处理该任务。

 

创建线程池

    ExecutorService temp = new ThreadPoolExecutor(
            2,
            5,
            3,
            TimeUnit.SECONDS,
            new LinkedBlockingQueue<>(3),
            Executors.defaultThreadFactory(),
            new ThreadPoolExecutor.DiscardOldestPolicy());

 

获取线程,执行任务

temp.submit(Runnable task);

 

线程池执行流程:

 

JDK内置线程池

通过Executors对象可以获取:

  1、FixedThreadPool:线程数固定的线程池;

  2、CachedThreadPool:线程数根据任务动态调整的线程池;

  3、SingleThreadExecutor:仅单线程执行的线程池;

  ....

 

提问:为何不推荐使用jdk内置线程池?

回答:因为内置线程池底层设计中,对线程数量或等待队列长度的设置为 Integer.MAX_VALUE ,存在OOM(内存泄漏)风险。

 

标签:内置,Java,队列,任务,谈谈,线程,new,ThreadPoolExecutor
From: https://www.cnblogs.com/lurenjia-bky/p/17338809.html

相关文章

  • 线程池
    #include"CThreadPool.h"boolCThreadPool::Create(uint32_tnThreadCnt){//创建信号量m_hSemphore=CreateSemaphore(NULL,0,MAXLONG,NULL);//check...//创建线程if(nThreadCnt==-1){SYSTEM_INFOsi;GetSystemInfo(&si);......
  • JavaScript学习
    JS中的注释学习一个语言,先学习一个语言的注释,因为注释是给我们自己看的,也是给开发人员看的写好一个注释,有利于我们以后阅读代码5-1单行注释一般就是用来描述下面一行代码的作用可以直接写两个/,也可以按ctrl+///我是一个单行注释//下面代码表示在浏览器里面出现一个弹出......
  • JavaScript学习笔记
    SassSASS官网世界上最成熟、最稳定、最强大的专业级CSS扩展语言!sass是一个css的预编译工具也就是能够更优雅的书写csssass写出来的东西浏览器不认识依旧是要转换成css在浏览器中运行变量定义一个变量,在后面的代码中使用使用$来定义变量//定义一个$c作为变量,值是红......
  • JAVA访问修饰符与关键字
    访问修饰符定义:Java中,可以使用访问修饰符来保护对类、变量、方法和构造方法的访问。Java支持4种不同的访问权限。分类:private:在同一类内可见。使用对象:变量、方法。注意:不能修饰类(外部类)default(即缺省,什么也不写):在同一包内可见,不使用任何修饰符。使用对象:类......
  • Java Long对象对比,用equals函数
    文章目录一、前文二、调试三、后记一、前文同事问我一个问题,我咋一看也愣住了代码:if(ObjectUtil.isNotNull(temp.getUserId())&&temp.getUserId()!=SecurityUtils.getUserId()){logger.error(temp.toString());logger.error("SecurityUtils.getUserId()="+Secur......
  • 学习JavaScript
    操作步骤开通语音识别服务在调用语音识别相关接口前,您需要进入 语音识别控制台,进行实名认证和人脸认证,认证完成后,阅读《用户协议》后勾选“我已阅读并同意《用户协议》”,然后单击【立即开通】,即可一键开通录音文件识别、实时语音识别、一句话识别、录音文件识别极速版、语......
  • JavaScript的节点操作
    目录节点概述节点层级添删等节点操作使用节点操作的示例节点概述一般来说,节点至少拥有nodeType,nodeName,nodeValue这三个基本属性1.元素节点的nodeType为12.属性节点的nodeType为23.文本节点的nodeType为3(包括换行,文字,空格)节点层级1.父节点:node.parentNode(1)paren......
  • 深入理解Java泛型、协变逆变、泛型通配符、自限定
    禁止转载重写了之前博客写的泛型相关内容,全部整合到这一篇文章里了,把坑都填了,后续不再纠结这些问题了。本文深度总结了函数式思想、泛型对在Java中的应用,解答了许多比较难的问题。纯函数协变逆变泛型通配符PECS法则自限定Part1:协变与逆变Java8引入了函数式接口,......
  • java -- 函数式编程
    函数式编程面向对象过分强调“必须通过对象的形式来做事情”,而函数式思想则尽量忽略面向对象的复杂语法——强调做什么,而不是怎么做。有时只是为了做某事情而不得不创建一个对象,而传递一段代码才是我们真正的目的。LambdaLambda是一个匿名函数,可以理解为一段可以传递的代码。......
  • Java学习笔记(二)
    1.请描述标识符的命名规则答:(1)由26个英文字母大小写,数字,_或$组成。(2)不能以数字开头。(3)不能使用关键字和保留字(指已经定义过的变量),但是可以包含关键字和保留字。(4)严格区分大小写,无长度限制。(5)不能有空格。2.请描述数据类型存在的意义数据有明确的类型划分,为了确保变量保留的......