IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> Java知识库 -> JAVA基础-线程池篇 -> 正文阅读

[Java知识库]JAVA基础-线程池篇

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

线程池构造器ThreadPoolExecutor

corePoolSize 线程池核心线程数

线程池创建后,线程池中的线程数为0,当任务过来了就会创建一个线程去执行,当数量达到corePoolSize后,新来的任务会加入到任务队列(BlockingQueue)中,如果任务队列满了,那么会查看当前线程数和最大线程数,如果没有超过则创建新的线程来执行任务,否则交给拒绝策略来处理无法处理的任务,RejectedExecutionHandler.rejectedExecution()。

线程池在线程数没有达到核心线程数时,每次任务执行,都会创建一个新的线程来执行。

maximumPoolSize

最大线程数,当线程池达到核心线程数,任务队列满了,并且线程数已经达到最大线程数了,这时,RejectedExecutionHandler.rejectedExecution()就会拒绝处理任务抛出异常。

keepAliveTime

当线程的空闲时间达到keepAliveTime时,线程会退出,直到线程数=corePoolSize,

如果allowCoreThreadTimeout=true,则会全部退出,直到线程数量为0.

unit

keepAliveTime时间的单位时间

workQueue

保存任务的队列

handler

拒绝处理器,用于在线程池无法处理任务的时候处理操作。

Executors 和 ThreadPoolExecutor.

不允许使用Executors

Executors的 newCachedThreadPool方法,最大线程数是Integer.MAX_VALUE=2147483647这么大,无限制的创建线程,甚至是OOM.

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

newScheduledThreadPool方法,也是使用了Integer.MAX_VALUE

public static ScheduledExecutorService newSingleThreadScheduledExecutor() {
    return new DelegatedScheduledExecutorService
        (new ScheduledThreadPoolExecutor(1));
}
public ScheduledThreadPoolExecutor(int corePoolSize) {
    super(corePoolSize, Integer.MAX_VALUE,
          DEFAULT_KEEPALIVE_MILLIS, MILLISECONDS,
          new DelayedWorkQueue());
}

newSingleThreadExecutor和newFixedThreadPool这两个方法使用了LinkedBlockingQueue这个队列来做任务存储队列。这个任务队列是无边界的,容易产生任务堆积,更容易把内存用完。

public static ExecutorService newSingleThreadExecutor() {
    return new FinalizableDelegatedExecutorService
        (new ThreadPoolExecutor(1, 1,
                                0L, TimeUnit.MILLISECONDS,
                                new LinkedBlockingQueue<Runnable>()));
}

任务队列的选择:

BlockingQueue队列接口,所有的实现类都是并发安全的队列。分为无界队列和有界队列。

ArrayBlockingQueue

底层是数组实现的有界队列,并发控制采用可重入锁控制,插入读取都需要获取锁。

SynchronousQueue

LinkedBlockingDeque

LinkedBlockingQueue

  Java知识库 最新文章
计算距离春节还有多长时间
系统开发系列 之WebService(spring框架+ma
springBoot+Cache(自定义有效时间配置)
SpringBoot整合mybatis实现增删改查、分页查
spring教程
SpringBoot+Vue实现美食交流网站的设计与实
虚拟机内存结构以及虚拟机中销毁和新建对象
SpringMVC---原理
小李同学: Java如何按多个字段分组
打印票据--java
上一篇文章      下一篇文章      查看所有文章
加:2021-08-15 15:22:28  更:2021-08-15 15:23:51 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年5日历 -2024/5/20 9:44:01-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码