| |
|
开发:
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 |
|
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
360图书馆 购物 三丰科技 阅读网 日历 万年历 2025年3日历 | -2025/3/4 8:01:06- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |