问题:请讲下java中的线程池

分析:在面试中经常问到线程池的问题,要掌握其基本概念,使用方法,注意事项等,引申下tomcat中默认的线程数是多少

回答要点:

主要从以下几点去考虑,

1、为什么要使用线程池

2、线程池的基本参数

3、为什么不使用java提供的线程池,而是使用自己创建

4、如何设置线程数大小;

5、线程池在tomcat中的使用;

为什么要使用线程池

在日常的开发过程中,经常要用到多线程,那么为什么不直接新建一个线程,而是选择使用线程池那,因为线程的创建要消耗系统资源,占用CPU的时间,所以考虑使用线程池;

线程池的基本参数

Java提供了线程池类ThreadPoolExecutor,该类是线程池的基类,有以下参数

corePoolSize   核心线程数

maximumPoolSize  最大线程数

keepAliveTime  线程数超过核心线程数后,多余的线程的空闲时间

unit  上面的参数的单位

workQueue  阻塞队列

threadFactory  创建线程的工厂

handler  拒绝策略

一个任务被提交到线程池的过程:

从上面的流程图中可以引申出以下几个问题,核心线程数要怎么设置;阻塞队列有几种;拒绝策略有几种;

先看阻塞队列及决策策略

阻塞队列

常用的阻塞队列有ArrayBlockingQueue、LinkedBlockingQueue、SynchronousQueue、priorityBlockingQueue

ArrayBlockingQueue  底层使用数组+ReeTrantLock实现,既然是数组实现那么必然就要指定数组的长度

LinkedBlockingQueue  使用单链表实现,最大长度为Integer.MAX_VALUE

SynchronousQueue  要将任务放入SynchronousQueue中必须有一个线程在等待消费该任务,如果没有线程在等待,那么线程池中线程数小于最大线程数就会创建一个线程,否则会执行拒绝策略

PriorityBlockingQueue  具有优先级的阻塞队列

拒绝策略

ThreadPoolExecutor实现了4中拒绝策略,CallerRunsPolicy、AbortPolicy、DiscardPolicy、DiscardOldestPolicy

CallerRunsPolicy  调用者来执行该任务;

AbortPolicy  抛出异常,开发者可以捕获该异常,默认的策略;

DiscardPolicy  直接丢弃,什么也不做;

DiscardOldestPolicy  丢弃队列中最老的任务,就是最先入队的任务,也即将要被执行的任务;

java提供的线程池

Java的Exectors类提供了一些线程池的方法供开发者来用,但是最好不用Java提供的,下面看有哪些以及为什么不建议使用

newFixedThreadPool()  固定线程数的线程池,核心线程数=最大线程数,使用LinkedBlockingQueue,拒绝策略是默认的AbortPolicy;适用于为了满足资源管理的要求,而限制线程数量,适用于负载较重的机器

newSingleThreadExecutor()  只有一个线程的线程池,核心线程数=最大线程数=1,使用LinkedBlockingQueue,拒绝策略是默认的AbortPolicy;适用于顺序执行各个任务的场景

newCachedThreadPool()  按需创建新的线程池,核心线程数=0,最大线程数为Integer.MAX_VALUE,阻塞队列为SynchronousQueue,拒绝策略是默认的AbortPolicy,线程池可以无限扩展,当任务多时创建许多线程,任务少时,自动清空线程;适应于执行短期异步任务,或者负载较轻的机器

newScheduledThreadPool()  创建一个延时或定时的线程池,最大线程数为Integer.MAX_VALUE,阻塞队列为DelayedWorkQueue

如何设置线程池中线程的数量

要想设置合理的线程数,需要区分任务是计算(CPU)密集型还是IO密集型

计算密集型  针对计算密集型一般设置为CPU核数+1比较合理,因为是计算密集型,那么计算就要用CPU,设置为CPU的核数可以充分利用CPU的优势,至于为什么要加1,可以理解为计算密集型,也要有IO操作,加1是为了在等待IO的时候,充分利用CPU

IO密集型  对应IO密集型,也就是说该任务涉及很多的IO操作,比如读写磁盘,远程RPC调用等,网上有很多数是设置为2*CPU核数+1,当然这也是可以的,不过下面这样设置可能更能发挥CPU的性能,CPU数*CPU利用率*(任务等待时间/任务计算时间+1),假如有个8核机器,任务有100ms在计算,800ms在等待IO,CPU的利用率为100%的话,线程数=8*1*(800/100+1)=72,当然现实场景中CPU的利用率不可能飙到100%,还要具体场景具体分析;

线程池在tomcat中的使用

tomcat作为servlet服务器,要处理请求,是为每个请求创建一个线程,那么它的配置是在哪里那,在tomcat的conf/server.xml文件中

看上面有个Executor的配置实例,maxThreads的配置,看上图中例子给出的值为150。其实tomcat7/8默认的线程池大小为200.

参考:https://joonwhee.blog.csdn.net/article/details/106609583

java面试一日一题:java线程池的更多相关文章

  1. java面试一日一题:java中的垃圾回收器

    问题:请讲下java中垃圾回收器有哪些? 分析:该问题主要考察hotspot虚拟机下实现的垃圾回收器 回答要点: 主要从以下几点去考虑, 1.垃圾回收器的种类 2.每种垃圾回收器的着重点是什么 前边的 ...

  2. java面试一日一题:mysql中常用的存储引擎有哪些?

    问题:请讲下mysql中常用的引擎有哪些? 分析:该问题主要考察对mysql存储引擎的理解,及区别是什么? 回答要点: 主要从以下几点去考虑, 1.mysql的存储引擎的基本概念? 2.mysql中常 ...

  3. java面试一日一题:讲下在什么情况下会发生类加载

    问题:请讲下在什么情况下会发生类加载? 分析:该问题主要考察对java中类加载的知识,什么是类加载,为什么会发生类加载,什么情况下发生类加载? 回答要点: 主要从以下几点去考虑 1.什么是类加载: 2 ...

  4. java面试一日一题:讲下mysql中的undolog

    问题:请讲下mysql中undo log的作用 分析:mysql中有很多日志,例,bin log undo log redo log,要弄清楚这些日志的作用,就要了解这些日志出现的背景及要解决的问题: ...

  5. java面试一日一题:java中垃圾回收算法有哪些

    问题:请讲下在java中有哪些垃圾回收算法 分析:该问题主要考察对java中垃圾回收的算法以及使用场景 回答要点: 主要从以下几点去考虑, 1.GC回收算法有哪些 2.每种算法的使用场景 3.基于垃圾 ...

  6. java面试一日一题:讲对mysql的MVCC的理解

    问题:请讲下对mysql中MVCC的理解 分析:这个问题要回答的是对MVCC的理解,以及MVCC解决了什么问题这几个方面入手. 回答要点: 主要从以下几点去考虑, 1.什么是MVCC? 2.MVCC用 ...

  7. java面试一日一题:如何判断一个对象是否为垃圾对象

    问题:请讲下在java中如何判断一个对象是否为垃圾 分析:该问题主要考察对java中的垃圾回收,用什么方式去识别一个对象是垃圾: 回答要点: 主要从以下几点去考虑, 1.GC回收的是什么,回收发生在内 ...

  8. java面试一日一题:如何设计一款垃圾回收器

    问题:如果让你设计一个垃圾回收器,你会考虑哪些问题 分析:该问题主要考察对java中垃圾回收器的理解,要理解怎么回收:一款好的垃圾回收器有哪些衡量指标 回答要点: 主要从以下几点去考虑, 1.垃圾回收 ...

  9. java面试一日一题:java中一个对象实例的结构是什么样子的

    问题:请讲下在java程序运行时一个对象实例的数据结构是什么样子的 分析:该问题主要考察对java中对象的理解,在程序运行过程中一个对象实例是以什么样的形式存在的 回答要点: 主要从以下几点去考虑, ...

随机推荐

  1. how to group date array by month in javascript

    how to group date array by month in javascript https://stackoverflow.com/questions/14446511/most-eff ...

  2. Event Bus & Event Emitter

    Event Bus & Event Emitter Event Bus https://code.luasoftware.com/tutorials/vuejs/parent-call-chi ...

  3. Captain technology开发的新能源汽车强在哪里?

    在新能源汽车飞速发展的这些年,Captain technology 认识到,要改变有状况,就要不断创新,调整新能源汽车发展路线.新能源汽车本质永远是汽车, Captain technology是在改变 ...

  4. 从微信小程序到鸿蒙js开发【06】——swiper&animator&marquee

    目录: 1.swiper轮播图 2.image-animator幻灯片 3.marquee跑马灯 4.nginx动静分离 1.swiper轮播图 微信小程序的swiper组件中只能放置swiper-i ...

  5. MySQL -- 内部临时表

    本文转载自MySQL -- 内部临时表 UNION UNION语义:取两个子查询结果的并集,重复的行只保留一行 表初始化 CREATE TABLE t1(id INT PRIMARY KEY, a I ...

  6. MySQL5.7.29 和 Navicat ===> windows窗口式按装和使用

    MySQL windows窗口式按装下载方法:官网: https://www.mysql.com/ ==> DOWNLOADS ==> MySQL Community (GPL) Down ...

  7. React Context 理解和使用

    写在前面 ​ 鉴于笔者学习此内容章节 React官方文档 时感到阅读理解抽象困难,所以决定根据文档理解写一篇自己对Context的理解,文章附带示例,以为更易于理解学习.更多内容请参考 React官方 ...

  8. 在 Svelte 中使用 CSS-in-JS

    你即便不需要,但你可以. 注意:原文发表于2018-12-26,随着框架不断演进,部分内容可能已不适用. CSS 是任何 Web 应用程序的核心部分. 宽泛而论,如果一个 UI 框架没有内置向组件添加 ...

  9. centos7.5+nginx+php急速配置

    centos7.5+nginx+php急速配置 centosnginxphp 更新系统以及添加源 yum update yum -y install epel-release 安装php以及配置 yu ...

  10. Python3.x 基础练习题100例(01-10)

    练习01: 题目: 有四个数字:1.2.3.4,能组成多少个互不相同且无重复数字的三位数?各是多少? 分析: 可填在百位.十位.个位的数字都是1.2.3.4.组成所有的排列后再去 掉不满足条件的排列. ...