自己学习实现线程池处理任务队列

本文介绍了如何实现一个线程池,重点在于线程复用机制,线程在启动时创建并保持运行状态,等待任务队列中的任务。线程安全通过ConcurrentLinkedDeque保证,同时提供了测试线程安全的示例和使用线程池的实例。

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

要点:
1、目前实现的线程数量不可变,且线程启动时就创建
2、“线程复用”原理是线程run方法循环等待和唤醒(等待队列插入,插入后唤醒)
3、通过线程退出run方法来达到关闭线程的目的。
4、ConcurrentLinkedDeque是单个方法级别线程安全,如果需要代码块级别的线程安全,就需要加锁。

一、代码


import java.util.ArrayList;
import java.util.LinkedList;
import java.util.List;
import java.util.concurrent.ConcurrentLinkedDeque;
import java.util.concurrent.locks.LockSupport;

/**
 * 启动即创建固定数量的线程,用于并发处理任务队列中的任务
 * 使用ConcurrentLinkedDeque、synchronized以及LockSupport来保证线程安全
 */
public class ThreadPool {
   
    private int poolSize;
    private boolean isShutDown = false;
    private List<Long> threadList = new ArrayList<>();
    //任务队列
    private ConcurrentLinkedDeque<Runnable> taskList = new ConcurrentLinkedDeque<>();
    //当前空闲线程集合
    private volatile LinkedList<Thread> waitThreads = new LinkedList<>();

    /**
     * 初始化线程池
     *
     * @param poolSize 线程数量
     */
    public ThreadPool(int poolSize) {
   
        this.poolSize = poolSize;
        for (int i = 0; i < poolSize; i++) {
   
            Thread thread = new Thread(new worker(), "t" + i);
            threadList.add(thread.getId());
            thread.start();
        }
    }

    /**
     * 添加Runnable类型的任务到任务队列并等待处理
     *
     * @param task 任务
     */
    public void addTask(Runnable task) {
   
        if (isShutDown) {
   
            return;
        }
        taskList.addLast(task);//加到队尾,确保线程安全
        synchronized (waitThreads) {
   
            if (waitThreads.size() > 0) {
   
                LockSupport.unpark(waitThreads.pollFirst());//唤醒等待中的线程
            
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值