浅谈线程池

一、创建一个线程池

corePoolSize:核心线程数——最小空闲线程数(这很重要)

maximumPoolSize:最大线程数——核心线程+非核心线程数了

keepAliveTime:空闲线程等待新线程加入间隔时间

unit:空闲线程等待新线程加入间隔时间单位

workQueue:等待执行的线程队列

threadFactory:用于创建新线程的工厂类,可以用于自定义线程名称

handler:用于执行拒绝策略

二、线程池的基本使用

2.1示例代码

import java.util.concurrent.*;

import java.util.concurrent.atomic.AtomicInteger;

public class Main {

public static void main(String[]args) {

/**

* 业务需求

* 你在网上同时约了20个女神奔现

* 你忙不过来找了一个兄弟陪你一起

* 约了2个贵宾室2个普通包间(只能在贵宾室或包间内聊天)

* 酒店的大厅有8个座位

* 打算每个女神聊三秒(真男人系列)

* 请开始你的表演

*/

Executor executor = new ThreadPoolExecutor(2, 4, 0, TimeUnit.MILLISECONDS, new LinkedBlockingQueue<>(8), new ThreadFactory() {

AtomicInteger chatNum = new AtomicInteger(0);

@Override

public ThreadnewThread(Runnable r) {

return new Thread(r, "聊天室" + chatNum.getAndIncrement());

}

}, new RejectedExecutionHandler(){

@Override

public void rejectedExecution(Runnabler, ThreadPoolExecutor executor) {

System.out.println("女神,不好意思,贵宾室和包间都挤满了!!!");

}

});

for (int i = 0; i < 20; i++) {

executor.execute(() -> {

try {

System.out.println("我在" + Thread.currentThread().getName() + "和女神聊3秒钟的天");

Thread.sleep(3000);

} catch(InterruptedException e) {

throw new RuntimeException(e);

}

});

}

}

}

2.2执行结果

2.3执行过程分析图

三、其余四种线程池(不推荐使用)

3.1FixedThreadPool

FixedThreadPool顾名思义即是固定数量的线程池,他的核心线程与非核心线程数量都由使用者指定且相等,即最小空闲线程随时都是nThreads

其空闲线程等待执行时间为0,因为没有非核心线程,所以不需要等待

队列使用了LinkedBlockingQueue并且没有指定队列大小,所以默认等待队列大小为Integer.MAX_VALUE

3.2SingleThreadPool

注意看他与FixedThreadPool其实没有太大的区别,相当于默认nThreads设置为了1,所以两者放在一起讲解

3.3CachedThreadPool

缓存线程池,使用SynchronousQueue作为缓存队列,即不接受缓存,同时非核心线程为Integer.MAX_VALUE,所以线程会立即得到执行,小心线程爆炸

3.4ScheduledThreadPoolExecutor

用于执行定时任务的线程池,通过DelayedWorkQueue实现定时任务的获取和控制

3.5不推荐原因

几种线程池未指定等待队列的容量,并发量高时容易发生内存占用过高或溢出,后续会对几种队列进行描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值