目录
文本主要讲3个问题:
- 线程是什么?
- 线程有哪些状态?各状态间的转换了解吗?
- 创建线程的3种方法你都了解吗?
备注:如果不方便看文章,可以直接去看我的视频,抖音搜索【程序员一棵树】。
1. 线程是什么?
要介绍线程,我们首先需要知道什么是进程。
进程:进程是一个具有一定独立功能的程序在一个数据集合上依次动态执行的过程。是一个正在执行的程序的实例,包括程序计数器、寄存器和程序变量的当前值等。
在介绍完进程以后,我们再来看一下更细粒度的线程。
线程:线程是进程中执行运算的最小单位,是进程中的一个实体,是被系统独立调度和分派的基本单位,线程自己不拥有系统资源,只拥有一点在运行中必不可少的资源,但它可与同属一个进程的其它线程共享进程所拥有的全部资源。一个线程可以创建和撤销另一个线程,同一进程中的多个线程之间可以并发执行。
下图直观展示了一下线程和进程的关系。
2. 线程各状态间的转换你了解吗?
首先,我们需要知道线程都有哪些状态。
线程有如下6个状态:1. 初始、2. 等待、3. 超时等待、4.运行(运行中、就绪)、5. 终止、6. 阻塞。(有时候会把运行中和就绪单独拿出来,此时就会有7种状态)
下面,我们通过一张图来展示各状态间的转换。
状态流转图
这里我们选几个比较常见的动作简要说明一下,
Sleep: 是简单的线程睡眠。 public static native void sleep(long millis) throws InterruptedException;
Yiled:从CPU上先离开,先让出一下,返回就绪状态。进入等待队列再等调度进行调用,不管后面其他线程能不能抢到;
Join:将其他线程加入进来,等加进来的运行完再运行(sleep再久也没用),一般用来按顺序
wait() 和 notify()是Object类的,等待,通知。
3. 创建建线程的3种方法你都了解吗?
- 继承Thread类。
- 实现Runnable。
- 使用Callable和FutureTask创建线程。
- 创建线程池 ThreadPoolExecutor。
main函数
执行结果:
对于线程池,我们这里简单介绍下ThreadPoolExecutor及其参数,因为它是Executors创建线程池的底层实现。(注意:ThreadPoolExecutor我们会在后续文章会对这块有详细展开,本文既然提到了就简单讲一下入参)
下图是ThreadPoolExecutor原始构造函数的JDK源码截图,这也是面试中最常会被问到,同时也是我们日常开发需要掌握的一个构造函数。下面我们对它的7个构造函数进行简要的介绍。
- corePoolSize – the number of threads to keep in the pool, even if they are idle, unless allowCoreThreadTimeOut is set (核心线程数。一直存在的,可供线程池使用的线程数量,可以理解为不会下线的常用工)
- maximumPoolSize – the maximum number of threads to allow in the pool (最大线程数。线程池中线程数的上限。)
- keepAliveTime – when the number of threads is greater than the core, this is the maximum time that excess idle threads will wait for new tasks before terminating. (非核心线程外的线程最大空闲时间。空闲时间超过该时间则线程销毁)
- unit – the time unit for the keepAliveTime argument (最大空闲等待时间的时间单位)
- workQueue – the queue to use for holding tasks before they are executed. This queue will hold only the Runnable tasks submitted by the execute method. (阻塞队列。用于存放暂时无法被执行的任务)
- threadFactory – the factory to use when the executor creates a new thread (线程工厂。线程池的线程都由该工厂创建)
- handler – the handler to use when execution is blocked because the thread bounds and queue capacities are reached(任务拒绝处理器。用于处理阻塞队列满时,无法加入到阻塞队列中的任务)
好了,本期的文章就到这里。更多更精彩的内容请关注。
V信公众号搜索 “程序员一棵树”。 内有相关文档原文和免费资料。
D音搜索 “程序员一棵树”。
B站搜索 “程序员一棵树”。