线程池核心概述
Executors工厂类使用
Executors工厂类底层源码分析详解
ThreadPoolExecutor自定义线程池
ThreadPoolExecutor拒绝策略详解
计算机密集型与IO密集型详解
如何正确的使用线程池
线程池
一说到这个词,大家很容易想到高并发等等各种脑补的场景。高并发其实是一个非常抽象的概念,要实现高并发其实不仅仅是一个JAVA 线程集合类、或者JAVA基础层面就能搞定的事情,在互联网大厂中,高并发其实涉及方方面面,从前端到后端,到支持高并发的中间组件,最后到数据存储,持久化层面等等,都需要对高并发做一些考量和设计,这也是我们后面专门开设高并发全面深入集训营的目标,就是为了让同学们全面的、系统的、深入的去学习高并发这门高深的技术栈!
线程池的作用,这是一道简单的初级面试题,可以从几个角度去回答说明:
管理控制:首先,从管理角度就是为了更好的控制线程,使用线程池来帮助我们去管
理线程,使得我们对线程的生命周期、初始化、运行状态、销毁等各个环节有一个把控。
系统资源:另外一点,从系统资源的角度考虑,线程池可以控制线程的数量,根据任务
的多少去对线程池中的线程个数进行添加或者减少,可以回收空闲状态的线程,减少线
程的频繁初始化和销毁,避免不必要的系统开销,节省系统资源,保障稳定性!
应用性能:从性能的角度去考虑,线程池可以配合高并发容器的设置,对任务和工作项
进行缓存,异步的多线程的去处理任务,从而提高应用服务的吞吐率、消费性能,也从而提
高单个线程的利用率。
兜底策略:从健壮性的角度去分析,线程池提供了很多拒绝策略,我们在任务过多或者处理
不过来的时候,可以进行有效的拒绝策略、降级方案,以补偿的形式进行处理任务,避免因
为线程池的问题对系统产生较为严重的影响。
当然如何使用好线程池,也是需要一些实际的经验,稍后会给大家一一道来!
Executors
为了更好的控制多线程,JDK提供了一套线程框架Executors,帮助开发人员有效地进
行线程控制。它们都在java.util.concurrent包中,是JDK并发包的核心。
Executors,他扮演这线程工厂的角色,我们通过Executors可以创建特定功能的线程池。
Executors创建线程池方法:
Executors创建线程池方法:
newFixedThreadPool()方法:该方法返回一个固定数量的线程池,该方法的线程数始终
不变,当有一个任务提交时,若线程池中空闲,则立即执行,若没有,则会被暂缓在一个
任务队列中等待有空闲的线程去执行。
newSingleThreadExecutor ()方法:创建一个线程的线程池,若空闲则执行,若没有空
闲线程则暂缓在任务列队中。
newCachedThreadPool()方法:返回一个可根据实际情况调整线程个数的线程池,不限制
最大线程数量,若有任务,则创建线程,若无任务则不创建线程。如果没有任务则线程在
60s后自动回收(空闲时间60s)。
newScheduledThreadPool()方法:该方法返回一个SchededExecutorService对象,但
该线程池可以指定线程的数量。
代码:
//4 创建一个带有定时机制的线程池
ScheduledExecutorService executorService4 = Executors.newScheduledThreadPool(1);
executorService4.scheduleWithFixedDelay(new Task(1), 5, 2, TimeUnit.SECONDS);//延迟
//五秒后每两秒执行一次
package com.bfxy.thread.core.pool;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;
public class UseExecutors {
public static void main(String[] args) {
//1 创建固定数量的线程池
ExecutorService executorService1 = Executors.newFixedThreadPool(5);
//2 单线程的线程池
ExecutorService executorService2 = Executors.newSingleThreadExecutor();
//3 创建一个没有容量限制的线程池
ExecutorService executorService3 = Executors.newCachedThreadPool();
//4 创建一个带有定时机制的线程池
ScheduledExecutorService executorService4 = Executors.newScheduledThreadPool(1);
executorService4.scheduleWithFixedDelay(new Task(1), 5, 2, TimeUnit.SECONDS);
}
}
task执行类:
package com.bfxy.thread.core.pool;
public class Task implements Runnable {
private int taskId;
public Task(int taskId) {
this.taskId = taskId;
}
public int getTaskId() {
return taskId;
}
public void setTaskId(int taskId) {
this.taskId = taskId;
}
@Override
public void run() {
System.err.println("run task id : " + this.taskId);
try {
Thread.sleep(3000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
public String toString(){
return "当前线程DI: " + this.taskId;
}
}