ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

java面经-线程池

2022-05-06 10:31:43  阅读:176  来源: 互联网

标签:java 队列 创建 面经 接口 任务 线程 ThreadPoolExecutor


一、创建线程的三种方式

1、通过继承Thread类继承

  

2、通过Runnable接口,重写run方法创建

3、通过Callable接口,实现call方法的创建

4、使用线程池的方式创建

 

 

二、为什么要用线程池

线程池提供了一种限制和管理资源(包括执行一个任务)的方式,每一个线程池都维护了一些基本的统计信息,例如已完成的任务数量。

线程池的优点:

1、降低资源消耗。通过重复利用已创建的线程降低线程创建和销毁造成消耗

2、提高响应速度,当任务到大时,任务可以不需要等到线程创建就能够立即执行。

3、提高线程的可管理性。线程是稀缺资源,如果无限制创建,不仅会消耗系统资源,还会降低系统的稳定性,使用线程可以统一分配和调优监控。

 

三、实现Runnable接口和Callable接口的区别

Runnable自1.0以来一直存在,但callable仅在jdk1.5引入,目的是为了处理runnable不支持的用例。

runnbale接口不会返回结果或抛出检查异常,但是callable可以。

所以如果任务不需要返回结果和抛出异常,推荐使用runnable接口,这样代码会更简洁。

 

四、线程池实现的两种方法(1、ThreadPoolExecutor构造方法,2、使用Executor框架的工具类Executors来实现)

第一种ThreadPoolExecutor 三个重要参数:

1、corePoolSize:核心线程数定义了最小可以同时运行的线程数

2、maximumPoolSize:当前队列存放的任务到大队列容量的时候,当前程序可以同时运行的线程数量最大的线程数

3、workQueue:当前任务队列。当前任务来了判断是否还有线程能够处理,如果不能就进入任务队列

四个其他参数:

4、keepAlive:当前线程数量大于corePoolSize的时候,如果这个时候没有任务提交,核心线程外的线程不会立即销毁,而是等待,时间超过了就会被销毁。

5、unit:参数 的时间单位

6、threadFactory:executor创建新线程的时候会用到

7、handler:饱和拒绝策略。

 

饱和策略定义:

如果当前同时运行的线程数量达到最大线程数量,并且队列已被放满的时候,ThreadPoolTaskExecutor定义了一些策略:

1、ThreadPoolExecutor.AbortPolicy:抛出RejectedExecutionException来拒绝新任务的处理

2、ThreadPoolExecutor.CallerRunsPolicy:调用执行自己的线程运行任务,也就是直接调用execute (让调用者自己去执行任务,非线程池中的线程执行)。

方法的线程中运行run被拒绝的任务,如果执行程序已关闭,则丢弃该任务。因此这种策略降低了新任务的提交速度

影响程序的整体性能。如果程序可以承受这种延迟,可以选择该策略。

3、ThreadPoolExecutor.DiscardPolicy:不处理新任务,直接丢弃

4、ThreadPoolExecutor.DiscardOldestPolicy:此策略将丢弃最早未处理的请求。

 

阿里巴巴推荐中:不允许使用Executors创建线程,而是通过ThreadPoolExecutor的方式,这样处理方式规避资源消耗风险,明确线程池的运行规则。

弊端主要还是回可能造成OOM

FixedThreadPool和SingleThreadExecutor:允许请求队列的长度为Integer.MAX_VALUE,可能堆积大量的请求,导致OOM

CacheThreadPool和ScheduledThreadPool:允许创建线程数量为Integer.MAX_VALUE,可能会创建大量线程,导致OOM

 

线程池原理分析:

 

标签:java,队列,创建,面经,接口,任务,线程,ThreadPoolExecutor
来源: https://www.cnblogs.com/Alei777/p/16227657.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有