java线程池对象ThreadPoolExecutor的深入讲解

作者:大雨如注 时间:2023-05-15 06:49:51 

使用线程池的好处

1、降低资源消耗

可以重复利用已创建的线程降低线程创建和销毁造成的消耗。

2、提高响应速度

当任务到达时,任务可以不需要等到线程创建就能立即执行。

3、提高线程的可管理性

线程是稀缺资源,如果无限制地创建,不仅会消耗系统资源,还会降低系统的稳定性,使用线程池可以进行统一分配、调优和监控

ThreadPoolExecutor 介绍:

java 提供的线程池类;

ThreadPoolExecutor 作用:

两个作用:

1,用于分离执行任务和当前线程;

2,主要设计初衷:重复利用Thread 对象;

ThreadPoolExecutor 使用:

实例化:


public ThreadPoolExecutor(int corePoolSize,
       int maximumPoolSize,
       long keepAliveTime,
       TimeUnit unit,
       BlockingQueue<Runnable> workQueue) {
 this(corePoolSize, maximumPoolSize, keepAliveTime, unit, workQueue,
   Executors.defaultThreadFactory(), defaultHandler);
}

这是ThreadPoolExecutor的构造方法之一,传入参数最少,以下是参数说明:

corePoolSize  : 设置线程池的线程核心数量;该参数作用:当向线程池中添加的任务数量小于核心数量时,线程池将优先创建新的线程,而不是重用之前已存在的线程(不管该线程可用与否);

源码佐证,ThreadPoolExecutor 的 execute(Runnable) 方法中有源码如下:

java线程池对象ThreadPoolExecutor的深入讲解

maximumPoolSize : 设置线程池可创建最大线程数量;该参数作用:用于限制线程池无限制的创建线程;

源码佐证,ThreadPoolExecutor 的 addWorker(Runnable ,boolean) 方法中有源码如下:

java线程池对象ThreadPoolExecutor的深入讲解

keepAliveTime  : 设置线程池被创建线程的存活时间;

源码佐证,ThreadPoolExecutor 的 getTask()方法中有源码如下;源码说明:创建的线程将从任务队列中获取一个新的任务,在keepAliveTime时间之后如果还未获取到任务,将关闭该线程;

java线程池对象ThreadPoolExecutor的深入讲解

unit :设置线程池线程存活时间的时间单位;

workQueue :设置线程池用于存放任务的队列;

注意:ThreadPoolExecutor线程池是否创建新的线程不仅仅依赖于corePoolSize变量,还依赖于任务队列的offer(E) 方法所返回的值;比如:想要创建一个cache线程池,就依赖于一个特殊的任务队列:SynchronousQueue<E>;

源码佐证,ThreadPoolExecutor 的execute(Runnable) 方法中有源码如下:

java线程池对象ThreadPoolExecutor的深入讲解

示例: 创建固定线程池 和 cache线程池;

固定线程池,将corePoolSize 和 maximumPoolSize 设置相同即可,在Executors.newFixedThreadPool(10)有源码示例:


public static ExecutorService newFixedThreadPool(int nThreads) {
 return new ThreadPoolExecutor(nThreads, nThreads,
         0L, TimeUnit.MILLISECONDS,
         new LinkedBlockingQueue<Runnable>());
}

cacahe线程池,需要传入特殊的BlockingQueue对象,该对象需要在offer是返回false,并能够在poll方法中监听到offer进入的任务;java 提供了一个SynchronousQueue类,该类就是这样一个对象;在Executors.newCachedThreadPool()方法中,有源码示例:


public static ExecutorService newCachedThreadPool() {
 return new ThreadPoolExecutor(0, Integer.MAX_VALUE,
         60L, TimeUnit.SECONDS,
         new SynchronousQueue<Runnable>());
}

常用方法提示:

void execute(Runnable command) : 任务提交方法;线程池将顺序执行所提交的所有方法;

void shutdown() : 停止后续任务提交,但执行完当前线程池中所有任务;该方法的作用:线程池将中断当前所有空闲的线程,但不保证一定中断(可查看Thread的interrupt方法);那么工作中的线程将继续工作,直到完成;

源码:


public void shutdown() {
 final ReentrantLock mainLock = this.mainLock;
 mainLock.lock();
 try {
  checkShutdownAccess();
  advanceRunState(SHUTDOWN);
  interruptIdleWorkers(); 、//中断所有空闲的线程
  onShutdown(); // hook for ScheduledThreadPoolExecutor
 } finally {
  mainLock.unlock();
 }
 tryTerminate();
}

List<Runnable> shutdownNow() : 立即终止线程池;该方法的作用:线程池将中断所有创建的线程,但不保存一定中断;线程池将所有剩余的任务从任务队列中移除,不在执行,并保存在一个List中返回给用于;

方法源码:


public List<Runnable> shutdownNow() {
 List<Runnable> tasks;
 final ReentrantLock mainLock = this.mainLock;
 mainLock.lock();
 try {
  checkShutdownAccess();
  advanceRunState(STOP);
  interruptWorkers();
  tasks = drainQueue();
 } finally {
  mainLock.unlock();
 }
 tryTerminate();
 return tasks;
}

ThreadPoolExecutor 任务执行流程图:

java线程池对象ThreadPoolExecutor的深入讲解

ThreadPoolExecutor 使用注意点说明:

清晰需要使用的是那种类型的线程池,在实例化ThreadPoolExecutor时,传入的参数不同创建出来的线程池也将不同;尤其注意传入BlockingQueue参数,如果需要使用cache线程池,请确保BlockingQueue的offer方法反回false;可以参见SynchronousQueue类;

来源:http://www.cnblogs.com/loveyoumi/p/9578251.html

标签:线程池,对象,threadpoolexecutor
0
投稿

猜你喜欢

  • java如何将一个float型数的整数部分和小数分别输出显示

    2022-08-17 16:50:26
  • 基于Android LayoutInflater的使用介绍

    2023-12-22 23:50:03
  • Java 你知道什么是耦合、如何解(降低)耦合

    2022-03-23 08:44:19
  • 2022 最新 IntelliJ IDEA 详细配置步骤演示(推荐)

    2021-11-20 21:05:48
  • 微信js-sdk+JAVA实现“分享到朋友圈”和“发送给朋友”功能详解

    2021-10-20 23:13:51
  • 老生常谈Java异常处理和设计(推荐)

    2023-08-21 02:26:06
  • android开发仿ios的UIScrollView实例代码

    2023-08-07 01:55:20
  • 详解java模板和回调机制

    2023-08-13 15:33:46
  • C#使用NPOI设置Excel下拉选项

    2022-11-28 07:05:39
  • Android Studio设置主题与字体大小图文教程

    2023-05-25 15:54:10
  • 详解C#中使用对象或集合的初始值设定项初始化的操作

    2021-12-25 20:04:52
  • java 学习笔记(入门篇)_多选择结构switch语句

    2023-02-04 11:35:59
  • C#读写操作app.config中的数据应用介绍

    2021-07-25 21:33:19
  • Java利用apache ftp工具实现文件上传下载和删除功能

    2022-03-17 02:04:01
  • C#中winform控制textbox输入只能为数字的方法

    2023-06-26 12:09:03
  • Flutter实现底部导航栏效果

    2022-03-28 05:41:46
  • Android API开发之SMS短信服务处理和获取联系人的方法

    2021-10-23 03:22:15
  • Java编程中使用throw关键字抛出异常的用法简介

    2023-08-27 17:04:19
  • java中synchronized锁的升级过程

    2023-12-01 13:14:51
  • Unity3d实现Flappy Bird游戏

    2023-09-17 20:54:29
  • asp之家 软件编程 m.aspxhome.com