zoukankan      html  css  js  c++  java
  • 线程池

    线程池的作用

    控制系统中线程的数量。
    减少因为线程的创建和销毁占用的系统资源

    两个重要的概念

    一个线程集合workerSet 用于存放线程池中的线程
    一个阻塞队列workQueue 用于存放等待处理的任务

    ThreadPoolExecutor参数

    corePoolSize - 核心池大小
    maximumPoolSize-池中允许的最大线程数。
    keepAliveTime - 当线程数大于核心池大小时,多余的空闲线程等待新任务的最长时间。
    unit - keepAliveTime 参数的时间单位。
    workQueue - 执行前用于保持任务的队列。此队列仅保持由 execute方法提交的 Runnable任务。
    threadFactory - 执行程序创建新线程时使用的工厂。
    handler - 由于超出线程范围和队列容量而使执行被阻塞时所使用的处理程序。
    ThreadPoolExecutor是Executors类的底层实现。

    当向一个线程池中添加一个任务时的执行流程

    1、判断当前线程池大小是否小于corePoolSize,如果小于corePoolSize, 就创建线程并执行该任务,否则,将该任务放入阻塞队列
    2、如果能成功将任务放入阻塞队列中
    如果当前线程池是非RUNNING状态,则将该任务从阻塞队列中移除,然后执行reject()
    如果当前线程池处于RUNNING状态,则需要再次检查线程池(因为可能在上次检查后,有线程资源被释放),
    是否有空闲的线程;如果有则执行该任务;
    3、如果不能将任务放入阻塞队列中,说明阻塞队列已满;那么将尝试创建一个新的线程去执行这个任务;
    如果创建新线程失败,说明线程池中线程数达到maxPoolSize,则执行reject();

    Executors生成一些常用的线程池。

    (1)newFixedThreadPool()
    说明:初始化一个指定线程数的线程池,其中corePoolSize == maxiPoolSize,使用LinkedBlockingQuene作为阻塞队列
    特点:即使当线程池没有可执行任务时,也不会释放线程。

    (2)newCachedThreadPool()
    说明:初始化一个可以缓存线程的线程池,默认缓存60s,线程池的线程数可达到Integer.MAX_VALUE,即2147483647,内部使用SynchronousQueue作为阻塞队列;
    特点:在没有任务执行时,当线程的空闲时间超过keepAliveTime,会自动释放线程资源;当提交新任务时,如果没有空闲线程,则创建新线程执行任务,会导致一定的系统开销;
    因此,使用时要注意控制并发的任务数,防止因创建大量的线程导致而降低性能。

    (3)newSingleThreadExecutor()
    说明:初始化只有一个线程的线程池,内部使用LinkedBlockingQueue作为阻塞队列。
    特点:如果该线程异常结束,会重新创建一个新的线程继续执行任务,唯一的线程可以保证所提交任务的顺序执行

    (4)newScheduledThreadPool()
    特点:初始化的线程池可以在指定的时间内周期性的执行所提交的任务,在实际的业务场景中可以使用该线程池定期的同步数据。

    线程池的状态(5种)

    RUNNING 该状态的线程池会接收新任务,并处理阻塞队列中的任务;
    SHUTDOWN 该状态的线程池不会接收新任务,但会处理阻塞队列中的任务;
    STOP 该状态的线程不会接收新任务,也不会处理阻塞队列中的任务,而且会中断正在运行的任务;
    TIDYING 该状态表示线程池对线程进行整理优化;
    TERMINATED 该状态表示线程池停止工作;

    线程池的关闭(2种)

    shutdown():不会立即终止线程池,而是要等所有任务缓存队列中的任务都执行完后才终止,但再也不会接受新的任务
    shutdownNow():立即终止线程池,并尝试打断正在执行的任务,并且清空任务缓存队列,返回尚未执行的任务

    线程池容量可以动态调整

    ThreadPoolExecutor提供了动态调整线程池容量大小的方法:setCorePoolSize()和setMaximumPoolSize()

    如何合理配置线程池参数

    任务的性质:CPU密集型任务,IO密集型任务和混合型任务。
    任务的优先级:高,中和低。
    任务的执行时间:长,中和短。
    任务的依赖性:是否依赖其他系统资源,如数据库连接

    线程池比较重要的几个类

    Executer
    Executers
    ExecutorService				真正的线程池接口,集成Executer
    ScheduledExecutorService	能和Timer/TimerTask类似,解决那些需要任务重复执行的问题。
    ThreadPoolExecutor			ExecutorService的默认实现。
    ScheduledThreadPoolExecutor	继承ThreadPoolExecutor的ScheduledExecutorService接口实现,周期性任务调度的类实现。
  • 相关阅读:
    【HDOJ】2267 How Many People Can Survive
    【HDOJ】2268 How To Use The Car
    【HDOJ】2266 How Many Equations Can You Find
    【POJ】2278 DNA Sequence
    【ZOJ】3430 Detect the Virus
    【HDOJ】2896 病毒侵袭
    求奇数的乘积
    平方和与立方和
    求数列的和
    水仙花数
  • 原文地址:https://www.cnblogs.com/jis121/p/11040995.html
Copyright © 2011-2022 走看看