线程池的定义
线程池(Thread Pool)是一种多线程处理形式,通过预先创建一组线程并复用它们来执行任务,避免频繁创建和销毁线程带来的性能开销。线程池中的线程在任务到来时被唤醒执行任务,任务完成后不销毁而是等待下一个任务。
线程池的作用
1.降低资源消耗
线程的创建和销毁涉及系统调用和资源分配,频繁操作会消耗大量CPU和内存资源。线程池通过复用已创建的线程,减少线程生命周期管理的开销。
2.提高响应速度
当任务到达时,线程池中已有空闲线程可直接执行任务,无需等待线程创建。尤其适用于短任务或高并发场景。
3.提升线程可管理性
线程池可以统一管理线程数量、任务队列、拒绝策略等,避免无限制创建线程导致系统崩溃。例如通过核心线程数、最大线程数等参数控制并发量。
4.提供任务队列机制
线程池通常内置任务队列(如阻塞队列),当线程繁忙时,新任务会暂存队列中等待执行,实现任务的缓冲和调度。
接下来博主讲以代码的方式进行讲解
首先我们要先创建一个线程池类,用来初始化线程池
然后呢
public ThreadPool( int count){
for (int i=0;i<count;i++){
WorkThread workThread=new WorkThread(threadList);
new Thread(workThread).start();
}
这段代码就是初始化此线程池,包含了此线程池中有多少个任务线程(执行任务的线程),然后启动每个任务线程
List threadList=new ArrayList<>();这个代码就是创建任务列表,二线吗的那个add()方法就是往任务列表里添加任务
public class ThreadPool {
//存储需要完成的任务
List<Runnable> threadList=new ArrayList<>();
//初始化一个一次性可以执行count个的线程池
public ThreadPool( int count){
for (int i=0;i<count;i++){
WorkThread workThread=new WorkThread(threadList);
new Thread(workThread).start();
}
}
//往作业集合里添加任务,添加完成后唤醒线程池中的任务线程
public void add(Runnable runnable){
synchronized (threadList){
threadList.add(runnable);
threadList.notify();
}
}
}
然后下面的代码就是任务线程真正处理任务的过程,如果任务列表不为空就执行此任务,如果任务列表为空,就挂起此任务线程
代码里面还包含了简单的线程安全——给线程上锁(有兴趣的同学可以看看博主前面的文章)
public class WorkThread implements Runnable {
List<Runnable> threadList;
public WorkThread(List<Runnable> threadList) {
this.threadList=threadList;
}
@Override
public void run() {
while (true) {
//线程上锁,防止数据出错
synchronized (threadList) {
//如果任务列表为空的,停止此线程
while(threadList.isEmpty()){
try {
System.out.println(Thread.currentThread().getName()+"正在等待!!");
threadList.wait();
} catch (InterruptedException e) {
throw new RuntimeException(e);
}
}
//返回删除的线程:目的:执行完此任务后,把他从任务列表中拿出来
Runnable runnable=threadList.remove(0);
runnable.run();
}
}
}
}
下面的代码是创建线程池,并把线程池里分配5个线程,以及往任务列表里添加20个任务
public class Test {
public static void main(String[] args) {
//初始化一个任务线程为5(一次并发处理线程的数量往)的线程池
ThreadPool threadPool = new ThreadPool(5);
//添加20个任务
for (int i = 0; i < 20; i++) {
threadPool.add(new TestWork(i));
}
}
}
class TestWork implements Runnable{
int count;
public TestWork(int count){
this.count=count;
}
@Override
public void run() {
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
throw new RuntimeException(e);
}
System.out.println("处理任务:"+count);
}
}
710

被折叠的 条评论
为什么被折叠?



