ThreadLocal
线程变量,为每一个线程复制一份变量,每个线程对自己内部的变量进行操作,实现线程封闭。
ThreadLocal原理分析
底层是维护了一个ThreadLocalMap,key是当前线程,value是线程变量。
ThreadLocal造成内存泄漏问题
底层的ThreadLocal的key是一个弱引用,容易被回收掉,导致key为null,而value是一个强引用关系,如果当前线程一直不结束,key为null的entry的value就会存在一条强引用链,无法回收,所以就引起内存泄漏。
解决办法:在使用完毕,调用remove()方法,删除数据。
线程池
对于一些线程执行时间短,数量多,频繁创建和销毁线程造成时间浪费。
使用线程池,线程复用,不销毁。
ThreadPoolExecutor类
七个参数
corePoolSize:核心线程数量
1.初始值为0,当任务需要时,创建一个线程,直至到达核心线程数量,多的线程进入阻塞队列
2.调用预先创建线程的方法,直接创建核心线程数量或者一个线程。
maxmumcoresize :最大线程创建数量
keepaliveTime:未执行任务的线程多久终止
unit:keepaliveTime的时间单位
workQueen:阻塞队列
threadfactory:线程工厂,主要用来创建线程
handler:拒绝策略
线程池的执行流程
提交任务—>判断核心线程是否已满—是--->判断队列是否已满—是–>是否达到最大线程数量—是--->拒接策略执行无法完成的任务
否的话就创建核心线程任务—>添加到队列–>创建非核心线程任务
线程池中的队列
有界队列:用数组实现的有界阻塞队列,必须指定容量的大小。
可设置参数队列:基于链表实现的阻塞队列,可以进行设置容量,不设置的话就是无界的阻塞队列(默认为integer.MAX_VALUE)
延迟队列:延迟执行的队列,指定延迟时间,时间到了才能够从数组中获取到该元素。
优先级队列:具有优先级的无界阻塞队列
同步队列:不存储任务的阻塞队列,插入元素到队列的线程被阻塞,直到另一个线程从队列中获取了队列存储的元素。
拒绝策略
AbortPolicy:直接抛出异常
callerRunsPolicy:在调用者线程运行被抛弃的任务
DiscardOleddestPolicy:丢弃等待时间最长的任务
DiscardPolcy:默默丢弃,无反应
submit和execute的区别
有返回值(实现callable接口,有返回值,返回的是future类型,通过里面的get方法得到返回值)和无返回值的区别
关闭线程池
shutdown :不在接收新任务,不会强制停止正在执行的任务
shutdownNow :正在执行的任务停止,还未执行的任务取消