线程-自定义线程池

线程池的定义

线程池(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);
        }
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值