ThreadLocal与线程池的相关理解

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 :正在执行的任务停止,还未执行的任务取消

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值