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

要点:
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());//唤醒等待中的线程
            
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
EPOLL和线程池是在C++常用的技术,用于实现高效的网络编程。EPOLL是Linux下的一种I/O多路复用机制,可以同时监控多个文件描述符的状态变化,从而实现高并发的网络通信。线程池则是一种线程管理机制,通过预先创建一定数量的线程,将任务分配给这些线程来执行,从而提高程序的并发性能。 在C++,可以使用EPOLL和线程池实现高性能的网络服务器。EPOLL负责监听和处理网络事件,而线程池则负责处理具体的业务逻辑。当有新的连接到来时,EPOLL会将该连接的文件描述符添加到监听列表,并在有事件发生时通知线程池进行处理线程池的线程会从任务队列取出任务,并执行相应的操作。通过EPOLL和线程池的搭配使用,可以实现高并发的网络通信,并提高程序的性能和可扩展性。 关于EPOLL和线程池的具体实现细节,可以参考相关的书籍和文章。例如,可以阅读《C++ Primer》和《C++ Concurrency in Action》等C++基础书籍,了解EPOLL和线程池的基本原理和用法。此外,还可以参考一些经验分享的文章,如CSDN上的《Visual Studio高效调试手段与技巧总结》和《C++没落了?学习C++没有前途了?从业者给你揭晓答案》等,获取更多关于EPOLL和线程池的实践经验和技巧。\[1\]\[2\]\[3\] #### 引用[.reference_title] - *1* *2* *3* [C/C++学习路线总结与分享](https://blog.csdn.net/chenlycly/article/details/127191075)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insert_down1,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值