大家对常见的创建启动线程的两种方式已经非常了解,今天咱们来了解下第三种方式线程池,Java提供了原生的线程池实现。

一、常见创建启动线程两种方式

<ignore_js_op>

Java 初始化线程 线程池 java原生线程池_线程池

1、继承方式,自定义线程类继承java.lang.Thread类,然后调用start方法启动线程。

2、实现方式,自定义线程类实现java.lang.Runnable接口,调用Thread的构造方法传入Runnable对象实例线程对象,然后调用线程对象的start方法。

3、常见两种方式的优缺点:

<ignore_js_op>

Java 初始化线程 线程池 java原生线程池_Java 初始化线程 线程池_02

二、Executor框架-线程池

Executor框架体系是Java提供的一套原生的连接池实现,主要体系如下:

<ignore_js_op>

Java 初始化线程 线程池 java原生线程池_阻塞队列_03

咱们重点了解ThreadPoolExecutor线程池对象,使用线程池之后,不用频繁创建和销毁线程对象,单个线程对象可以重复为多个不同任务服务。

线程池可以解决两个不同问题:由于不用重复创建线程对象为任务服务,减少了每个任务调用的开销,通常可以改进高并发异步任务时性能以及JVM的内存利用,并且还提供绑定和管理资源的方法。

三、ThreadPoolExecutor线程池核心组成

<ignore_js_op>

Java 初始化线程 线程池 java原生线程池_阻塞队列_04

1、线程池对象的核心是持有一个阻塞队列BlockingQueue对象;

2、阻塞队列BlockingQueue核心任务控制工作任务Worker对象的数据结构的管理;

3、BlockingQueue接口分别提供了不同排队的策略;

4、工作任务Worker作为线程池类的内部类,在内部封装了Runnable任务线程对象;

四、ThreadPoolExecutor线程池类

在了解ThreadPoolExecutor线程池类时,重点了解线程池的执行原理,简单的理解就是在线程池中提供了可以为多任务重复服务的线程对象,详细了解线程池对象必须得理解构造线程池对象的核心要素,提供了四个构造方法:

<ignore_js_op>

Java 初始化线程 线程池 java原生线程池_Java 初始化线程 线程池_05

核心要素:

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工作机制

<ignore_js_op>

Java 初始化线程 线程池 java原生线程池_Java 初始化线程 线程池_06

1、提交任务到线程池;

2、线程池首先判断当前线程数是否小于核心线程数(corePoolSize),如果小于核心线程数直接创建新的线程数加入到线程池,实质是创建了一个Worker对象对线程对象和任务对象进行封装处理任务;

3、如果当前线程数大于核心线程数(corePoolSize)且小于最大线程数(maximumPoolSize)时,判断对应的线程队列是否已满,如果未满直接将当前任务加入到队列中等待处理;

4、如果当前队列已满,且小于最大线程数(maximumPoolSize)时则创建新的线程对象来处理任务;

5、如果线程池队列已满且已经超过允许的最大线程数量时,则按照线程池拒绝处理时策略机制进行处理;

六、ThreadPoolExecutor工作机制源码分析

代码清单1:

<ignore_js_op>

Java 初始化线程 线程池 java原生线程池_java_07

七、实例-多线程卖票

利用线程池多个线程模拟卖票功能:

<ignore_js_op>

Java 初始化线程 线程池 java原生线程池_Java 初始化线程 线程池_08

打印结果:

Java 初始化线程 线程池 java原生线程池_阻塞队列_09