【并发编程系列12】从Java线程池的常用4种写法深入分析线程池(Thread Pool)的实现原理

本文详细介绍了Java并发编程中的四种线程池:FixedThreadPool、SingleThreadExecutor、CachedThreadPool和ScheduledThreadPool,通过示例代码展示了它们的使用及特性。并深入分析了线程池ThreadPoolExecutor的构造参数、执行流程和内部类Worker的工作机制,包括addWorker方法、runWorker方法和getTask方法。最后探讨了线程池在不同状态下的任务处理策略和线程的生命周期管理。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

package com.zwx.concurrent.threadPool;

import java.util.concurrent.ExecutorService;

import java.util.concurrent.Executors;

public class TestThreadPool {

public static void main(String[] args) {

//FixedThreadPool - 固定线程数

ExecutorService fixedThreadPool = Executors.newFixedThreadPool(3);

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

fixedThreadPool.execute(()-> {

System.out.println(“线程名:” + Thread.currentThread().getName());

});

}

fixedThreadPool.shutdown();

}

}

输出结果为:

在这里插入图片描述

可以看到,最多只有3个线程在循环执行任务(运行结果是不一定的,但是最多只会有3个线程)。

FixedThreadPool调用了如下方法构造线程池:

在这里插入图片描述

SingleThreadExecutor


只有一个工作线程的执行器。如果这个线程在正常关闭前因为执行失败而被关闭,那么就会重新创建一个新的线程加入执行器。

这种执行器可以保证所有的任务按顺序执行,并且在任何给定的时间内,确保活动的任务只有1个。

示例

package com.zwx.concurrent.threadPool;

import java.util.concurrent.ExecutorService;

import java.util.concurrent.Executors;

public class TestThreadPool {

public static void main(String[] args) {

ExecutorService singleThreadExecutor = Executors.newSingleThreadExecutor();

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

singleThreadExecutor.execute(()-> {

System.out.println(“线程名:” + Thread.currentThread().getName());

});

}

}

}

singleThreadExecutor.shutdown();

运行结果只有1个线程:

在这里插入图片描述

SingleThreadExecutor调用了如下方法构造线程池:

在这里插入图片描述

CachedThreadPool


一个在需要处理任务时才会创建线程的线程池,如果一个线程处理完任务了还没有被回收,那么线程可以被重复使用。

当我们调用execute方法时,如果之前创建的线程有空闲可用的,则会复用之前创建好的线程,否则就会创建新的线程加入到线程池中。

创建好的线程如果在60s内没被使用,那么线程就会被终止并移出缓存。因此,这种线程池可以保持长时间空闲状态而不会消耗任何资源。

示例

package com.zwx.concurrent.threadPool;

import java.util.concurrent.ExecutorService;

import java.util.concurrent.Executors;

public class TestThreadPool {

public static void main(String[] args) {

ExecutorService cachedThreadPool = Executors.newCachedThreadPool();

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

cachedThreadPool.execute(()-> {

System.out.println(“线程名:” + Thread.currentThread().getName());

});

}

cachedThreadPool.shutdown();

}

输出结果可以看到,创建了9个不同的线程:

在这里插入图片描述

接下来我们对上面的示例改造一下,在执行execute之前休眠一段时间:

package com.zwx.concurrent.threadPool;

import java.uti

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值