线程池

线程池

1.好处
①重用线程池中的线程,避免因为线程的创建和销毁所带来的性能开销;
②能有效控制线程池的最大并发数,避免大量的线程之间因相互抢占系统资源而导致的阻塞现象;
③能够对线程进行简单管理,并提供定时执行以及指定间隔循环执行等功能;

2.ThreadPoolExecutor提供了一系列系数来配置线程池,通过不同的参数可以创建不同的线程池;
①corePoolSize:线程池的核心线程数,默认情况下,核心线程会在线程池中一直存活,即使他们一直处于闲置状态;
如果将ThreadPoolExecutor中的allowCoreThreadTimeOut属性设置为true,那么闲置的核心线程在等待新任务来临时会有超时策略,这个时间间隔由keepAliveTime来指定,当等待时间超过keepAliveTime所制定的时长后,
核心线程就会被终止;
②maximumPoolSize:线程池所能容纳的最大线程数,当活动线程数达到这个数值以后,后续的新任务将会被阻塞;
③keepAliveTime:非核心线程闲置时的超时时长,超过这个时长,非核心线程就会被回收;
④unit:用于指定keepAliveTime参数的时间单位;
⑤workQueue:线程池中的任务队列,通过线程池提交的Runnable对象都会存储在这个参数中;
⑥threadFactory:线程工厂,为线程池提供创建新线程的功能;
⑦ThreadPoolExecutor有个不常用的参数,RejectedExecutionHandler,当线程池无法执行任务时,这可能是由于任务队列已满或者无法成功执行任务,这个时候,ThreadPoolExecutor会通过RejectedExecutionHandler的rejecetdEexcution方法来通知调用者;
                                                                                                 
3.ThreadPoolExecutor执行任务时的流程
①如果线程池中的线程数量未达到核心线程的数量,那么会直接启动一个核心线程来执行任务;
②如果线程池中的线程数量已经达到或者超过核心线程的数量,那么任务会被插入到任务队列中等待执行;
③如果在步骤②中无法将任务插入到任务队列中,往往是由于任务队列已经满了,这个时候,如果线程数量未达到线程池规定的最大值,那么会立刻启动一个非核心线程来执行任务;
④如果步骤③中线程数量已经达到线程池规定的最大值,那么就拒绝执行此任务,ThreadPoolExecutor会通过RejectedExecutionHandler的rejecetdEexcution方法来通知调用者;

也就是说,优先级为:核心线程(已满)--->任务队列(已满)--->非核心线程(已满)--->RejectedExecutionHandler

4.常见线程池分类
①FixedThreadPool
线程数量固定的线程池,当线程处于空闲状态时也不会被回收,除非线程池关闭;
由于该线程池只有核心线程并且核心线程不会被回收,这意味着它能够更加快速的响应外界的请求;
并且核心线程没有超时机制,另外,任务队列也没有大小限制;
②CacheThreadPool
线程数量不固定的线程池,它只有非核心线程,并且线程最大数为Integer.MAX_VALUE,Integer.MAX_VALUE可以被认为是无限大;
当线程池中的线程都处于活动状态时,线程池会创建新的线程来处理任务,否则就会利用空闲的线程来处理新任务;
线程池中的空闲线程都有超机制,这个超时时长是60秒,超过60秒就会被回收;
CacheThreadPool中的任务队列相当于一个空集合,这将导致任何任务都会立即被执行;
这类线程池比较适合执行大量的耗时较少的任务;
③ScheduledThreadPool
核心线程数量是固定的,而非核心线程数是没有限制的;并且当非核心线程闲置时会被立即回收;
ScheduledThreadPool这类线程池主要用于执行定时任务和具有固定周期的重复任务;
④SingleThreadExecutor
这类线程池只有一个核心线程,它确保所有的任务都在同一个线程中按顺序执行;
SingleThreadExecutor的意义在于统一所有的外界任务到一个线程中,这使得在这些任务之间不需要处理线程同步的问题;

转载于:https://my.oschina.net/u/3491256/blog/1543937

内容概要:本文档详细介绍了在三台CentOS 7服务器(IP地址分别为192.168.0.157、192.168.0.158和192.168.0.159)上安装和配置Hadoop、Flink及其他大数据组件(如Hive、MySQL、Sqoop、Kafka、Zookeeper、HBase、Spark、Scala)的具体步骤。首先,文档说明了环境准备,包括配置主机名映射、SSH免密登录、JDK安装等。接着,详细描述了Hadoop集群的安装配置,包括SSH免密登录、JDK配置、Hadoop环境变量设置、HDFS和YARN配置文件修改、集群启动与测试。随后,依次介绍了MySQL、Hive、Sqoop、Kafka、Zookeeper、HBase、Spark、Scala和Flink的安装配置过程,包括解压、环境变量配置、配置文件修改、服务启动等关键步骤。后,文档提供了每个组件的基本测试方法,确保安装成功。 适合人群:具备一定Linux基础和大数据组件基础知识的运维人员、大数据开发工程师以及系统管理员。 使用场景及目标:①为大数据平台搭建提供详细的安装指南,确保各组件能够顺利安装和配置;②帮助技术人员快速掌握Hadoop、Flink等大数据组件的安装与配置,提升工作效率;③适用于企业级大数据平台的搭建与维护,确保集群稳定运行。 其他说明:本文档不仅提供了详细的安装步骤,还涵盖了常见的配置项解释和故障排查建议。建议读者在安装过程中仔细阅读每一步骤,并根据实际情况调整配置参数。此外,文档中的命令和配置文件路径均为示例,实际操作时需根据具体环境进行适当修改。
### 蓝桥杯 Java 第一天 学习资料与教程 对于希望参与蓝桥杯竞赛并专注于Java编程的学习者而言,初期准备阶段至关重要。首日的学习应当聚焦于夯实基础概念和技术要点。 #### 基础知识回顾 在开始深入研究之前,建议复习计算机科学的基础理论和算法设计原则。这不仅有助于理解后续更复杂的内容,还能提高解决问题的能力[^3]。 #### 获取高质量资源 由于优快云平台对上传图片的质量有限制,因此推荐通过其他渠道获得详细的电子版教材。例如,在微信公众号【一只阿欢】中回复特定关键词可以得到关于蓝桥杯Java B组学习材料、文件操作指南及考试重点解析的PDF文档下载链接[^1]。 #### 实践练习 为了更好地掌握所学的知识点,应该积极参与实际编码训练。可以从简单的例子入手,比如编写计算日期天数的小程序来熟悉语法结构: ```java public class Main { public static void main(String[] args) { System.out.println(31 + 29 + 31 + 30 + 4); } } ``` 这段代码展示了如何利用基本算术运算实现功能需求[^2]。 #### 数据结构入门 了解常用的数据结构也是必不可少的一部分。以`TreeSet`为例,这是一种能够自动维护元素顺序集合类;当自定义比较器时,则可以根据指定规则来进行排序处理: ```java import java.util.*; class MyClass implements Comparable<MyClass> { int a; int b; public MyClass(int a, int b) { this.a = a; this.b = b; } @Override public String toString() { return "MyClass{" + "a=" + a + ", b=" + b + '}'; } @Override public int compareTo(MyClass o) { if (this.a != o.a) return Integer.compare(this.a, o.a); else return Integer.compare(this.b, o.b); } } class MyComparator implements Comparator<MyClass> { @Override public int compare(MyClass m1, MyClass m2) { if (m1.a != m2.a) return Integer.compare(m1.a, m2.a); else return Integer.compare(m1.b, m2.b); } } public class TreeSetExample { public static void main(String[] args) { TreeSet<MyClass> treeSet = new TreeSet<>(new MyComparator()); treeSet.add(new MyClass(1, 2)); treeSet.add(new MyClass(2, 2)); treeSet.add(new MyClass(2, 3)); treeSet.add(new MyClass(4, 3)); treeSet.add(new MyClass(5, 6)); treeSet.add(new MyClass(7, 3)); Iterator<MyClass> it = treeSet.iterator(); while (it.hasNext()) { System.out.println(it.next().toString()); } } } ``` 此段代码说明了如何创建带有自定义比较逻辑的`TreeSet`实例,并向其中添加对象后遍历输出结果。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值