线程池(一)

1.线程池的基本概念

1.1 什么是线程池:

        线程池是一种利用池化技术思想来实现的线程管理技术,主要是为了复用线程、便利地管理线程和任务、并将线程的创建和任务的执行解耦开来。我们可以创建线程池来复用已经创建的线程来降低频繁创建和销毁线程所带来的资源消耗。在JAVA中主要是使用ThreadPoolExecutor类来创建线程池,并且JDK中也提供了Executors工厂类来创建线程池(不推荐使用)。

1.2 线程池的优点:

        降低资源消耗,复用已创建的线程来降低创建和销毁线程的消耗。
        提高响应速度,任务到达时,可以不需要等待线程的创建立即执行。
        提高线程的可管理性,使用线程池能够统一的分配、调优和监控。

1.3 为什么使用线程池:

        在执行一个异步任务或并发任务时,往往是通过直接new Thread()方法来创建新的线程,当数据量大,需要创建的多线程,这样做弊端较多,更好的解决方案是合理地利用线程池,对多线程进行统一的管理。

1.4 线程池的种类:
        java通过Executors提供四种线程池,分别为:

                newCachedThreadPool

                newFixedThreadPool

                newScheduledThreadPool

                newSingleThreadExecutor

2.线程池概述

Java中线程池的核心实现类是ThreadPoolExecutor,可以通过该类地构造方法来构造一个线程池,我们先来看下ThreadPoolExecutor的整个继承体系

Executor接口提供了将任务的执行和线程的创建以及使用解耦开来的抽象
ExecutorService接口继承了Executor接口,在Executor的基础上,增加了一些关于管理线程池本身的一些方法。

2.1 ThreadPoolExecutor的构造组成

        corePoolSize,核心线程数量,决定是否创建新的线程来处理到来的任务
        maximumPoolSize,最大线程数量,线程池中允许创建线程地最大数量
        keepAliveTime,线程空闲时存活的时间
        unit,空闲存活时间单位
        workQueue,任务队列,用于存放已提交的任务
        threadFactory,线程工厂,用于创建线程执行任务
        handler,拒绝策略,当线程池处于饱和时,使用某种策略来拒绝任务提交

public ThreadPoolExecutor(int corePoolSize,
                          int maximumPoolSize,
                          long keepAliveTime,
                          TimeUnit unit,
                          BlockingQueue<Runnable> workQueue,
                          ThreadFactory threadFactory,
                          RejectedExecutionHandler handler) 
2.2 线程池的生命周期
2.2.1 线程池五种状态

线程池的状态一共有五种,分别是RUNNING、SHUTDOWN、STOP、TIDYING、TERMINATED;

  1. RUNNING,表示可接受新任务,且可执行队列中的任务;
  2. SHUTDOWN,表示不接受新任务,但可执行队列中的任务;
  3. STOP,表示不接受新任务,且不再执行队列中的任务,且中断正在执行的任务;
  4. TIDYING,所有任务已经中止,且工作线程数量为0,最后变迁到这个状态的线程将要执行terminated()钩子方法,只会有一个线程执行这个方法;
  5. TERMINATED,中止状态,已经执行完terminated()钩子方法;
2.2.2 线程池生命周期流转

(1)新建线程池时,它的初始状态为RUNNING,这个在上面定义ctl的时候可以看到;

(2)RUNNING->SHUTDOWN,执行shutdown()方法时;

(3)RUNNING->STOP,执行shutdownNow()方法时;

(4)SHUTDOWN->STOP,执行shutdownNow()方法时;

(5)STOP->TIDYING,执行了shutdown()或者shutdownNow()后,所有任务已中止,且工作线程数量为0时,此时会执行terminated()方法;

(6)TIDYING->TERMINATED,执行完terminated()方法后;

 2.3 线程池地执行流程
  1. 如果workerCount < corePoolSize ==> 创建线程执行提交的任务
  2. 如果workerCount >= corePoolSize && 阻塞队列未满 ==> 添加至阻塞队列,等待后续线程来执行提交地任务
  3. 如果workerCount >= corePoolSize && workerCount < maxinumPoolSize && 阻塞队列已满 ==> 创建非核心线程执行提交的任务
  4. 如果workerCount >= maxinumPoolSize && 阻塞队列已满 ==> 执行拒绝策略

  • 30
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
线程池是一种常见的并发编程模型,它可以提高程序的并发性能,减少线程创建和销毁的开销,避免系统资源过度占用等问题。下面是一个简单的线程池实现示例: ```python import threading from queue import Queue class ThreadPool: def __init__(self, max_workers): self.max_workers = max_workers self.worker_queue = Queue() self.is_stopped = False def start(self): for i in range(self.max_workers): t = threading.Thread(target=self.worker) t.start() def stop(self): self.is_stopped = True def submit(self, task): self.worker_queue.put(task) def worker(self): while not self.is_stopped: try: task = self.worker_queue.get(timeout=1) task() except: pass ``` 在上面的代码中,我们定义了一个名为 ThreadPool 的类,它有以下方法: - `__init__(self, max_workers)`:初始化线程池,max_workers 表示线程池中最大的工作线程数。 - `start(self)`:启动线程池,创建指定数量的工作线程。 - `stop(self)`:停止线程池,让所有工作线程结束。 - `submit(self, task)`:提交一个任务到线程池,task 是一个可调用的对象(比如函数)。 - `worker(self)`:工作线程的执行函数,从任务队列中取出任务并执行。 使用线程池的示例代码如下: ```python pool = ThreadPool(4) pool.start() def task(): # 执行任务的代码 pass for i in range(10): pool.submit(task) pool.stop() ``` 在上面的代码中,我们创建了一个最大容量为 4 的线程池,然后提交了 10 个任务,最后停止了线程池。当每个工作线程都执行完自己的任务后,线程池才会停止。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值