Java线程池入门了解
Posted 源码时代
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java线程池入门了解相关的知识,希望对你有一定的参考价值。
大家对常见的创建启动线程的两种方式已经非常了解,今天咱们来了解下第三种方式线程池,Java提供了原生的线程池实现。
一、常见创建启动线程两种方式
1、继承方式,自定义线程类继承java.lang.Thread类,然后调用start方法启动线程。
2、实现方式,自定义线程类实现java.lang.Runnable接口,调用Thread的构造方法传入Runnable对象实例线程对象,然后调用线程对象的start方法。
3、常见两种方式的优缺点:
二、Executor框架-线程池
Executor框架体系是Java提供的一套原生的连接池实现,主要体系如下:
咱们重点了解ThreadPoolExecutor线程池对象,使用线程池之后,不用频繁创建和销毁线程对象,单个线程对象可以重复为多个不同任务服务。线程池可以解决两个不同问题:由于不用重复创建线程对象为任务服务,减少了每个任务调用的开销,通常可以改进高并发异步任务时性能以及JVM的内存利用,并且还提供绑定和管理资源的方法。
三、ThreadPoolExecutor线程池核心组成
1、线程池对象的核心是持有一个阻塞队列BlockingQueue对象;
2、阻塞队列BlockingQueue核心任务控制工作任务Worker对象的数据结构的管理;
3、BlockingQueue接口分别提供了不同排队的策略;
4、工作任务Worker作为线程池类的内部类,在内部封装了Runnable任务线程对象;
四、ThreadPoolExecutor线程池类
在了解ThreadPoolExecutor线程池类时,重点了解线程池的执行原理,简单的理解就是在线程池中提供了可以为多任务重复服务的线程对象,详细了解线程池对象必须得理解构造线程池对象的核心要素,提供了四个构造方法:
核心要素:
1、corePoolSize:线程池核心线程数量
2、maximumPoolSize:线程池最大线程数量
3、keepAliveTime:多余线程最大存放时间
4、TimeUnit unit:参数keepAliveTime的时间单位
5、BlockingQueue<Runnable> workQueue:用于传输和保持提交的任务的队列
6、ThreadFactory threadFactory:线程工厂,创建新的线程
7、RejectedExecutionHandler handler:线程池拒绝处理任务时选择的策略
ThreadPoolExecutor.AbortPolicy:丢弃任务并抛出RejectedExecutionException异常。
ThreadPoolExecutor.DiscardPolicy:也是丢弃任务,但是不抛出异常。
ThreadPoolExecutor.DiscardOldestPolicy:丢弃队列最前面的任务,然后重新尝试执行任务
ThreadPoolExecutor.CallerRunsPolicy:由调用线程处理该任务
五、ThreadPoolExecutor工作机制
1、提交任务到线程池;
2、线程池首先判断当前线程数是否小于核心线程数(corePoolSize),如果小于核心线程数直接创建新的线程数加入到线程池,实质是创建了一个Worker对象对线程对象和任务对象进行封装处理任务;
3、如果当前线程数大于核心线程数(corePoolSize)且小于最大线程数(maximumPoolSize)时,判断对应的线程队列是否已满,如果未满直接将当前任务加入到队列中等待处理;
4、如果当前队列已满,且小于最大线程数(maximumPoolSize)时则创建新的线程对象来处理任务;
5、如果线程池队列已满且已经超过允许的最大线程数量时,则按照线程池拒绝处理时策略机制进行处理;
六、ThreadPoolExecutor工作机制源码分析
代码清单1:
七、实例-多线程卖票
利用线程池多个线程模拟卖票功能:
打印结果:
更多细节控制请参考API。
源码快讯
推荐阅读
以上是关于Java线程池入门了解的主要内容,如果未能解决你的问题,请参考以下文章