1、继承Thread重写run方法
2、实现runnable
3、线程池
1、各参数解释如下,偷个懒吧,构造方法不止一个
2、任务执行过程
execute、submit
下面看下execute源码
1、判断当前线程池中核心线程数,如果核心线程数 小于定义的数量直接新建线程
2、如果核心线程等于定义的线程,就放入队列
3、如果队列满了,就会走else分支,创建非核心线程
4、如果添加失败就执行拒绝策略
5、接下来看下一个任务工作完成后线程池是如何工作的
上面有说到创建线程的两个方式,线程池是传入了runnable的实现类,我们来看下这个实现类的run方法
worker中的run方法如下
所以当task执行完后会在获取task,当然了里面会判断线程池是否shutdown等标志
以ArrayBlockingQueue为例,
6、如果((线程池内线程数量 > 核心线程)或者(允许核心线程超时切等待任务时间超过定义时间))并且有(超过一个线程或者队列为空 )就返回null
7、返回null就跳出了上面的while循环线程就会回收,通过上面图片也可以看出如果核心线程不允许回收当线程池 == 核心线程是就会阻塞线程,直到加入队列时offer调用了notEmpty.signal();