线程、线程池和ThreadLocal

什么是线程安全?(将自己的理解)

(一)为什么会有线程安全问题?
当多个线程同时共享同一个全局变量或静态变量,做写的操作时,可能会发生数据冲突问题,也就是线程安全问题。但是做读的操作不会发生线程安全问题。
(二)如何解决多线程之间线程安全问题?
使用多线程之间同步synchronized或使用锁(lock),将可能会发生数据冲突问题(线程不安全问题),只能让当前一个线程进行执行。代码执行完成后释放锁,然后才能让其他线程进行执行。这样的话,就可以解决线程不安全问题。
(三)什么是多线程之间同步?
当多个线程共享同一个资源,不会受到其他线程干扰。
(四)多线程死锁?
同步中嵌套同步,导致锁无法释放

线程池

(1)线程池就是事先将线程放到一个容器中,当使用线程的时候,不用再去new出一个线程,直接从线程池取出来就可以了
(2)参数介绍:
corePoolSize 核心线程数,指保留的线程池大小(不超过maximumPoolSize值时,线程池中最多有corePoolSize 个线程工作)。
maximumPoolSize 指的是线程池的最大大小(线程池中最大有corePoolSize 个线程可运行)。
keepAliveTime 指的是空闲线程结束的超时时间(当一个线程不工作时,过keepAliveTime 长时间将停止该线程)。
unit 是一个枚举,表示 keepAliveTime 的单位(有NANOSECONDS, MICROSECONDS, MILLISECONDS, SECONDS, MINUTES, HOURS, DAYS,7个可选值)。
workQueue 表示存放任务的队列(存放需要被线程池执行的线程队列)。
handler 拒绝策略(添加任务失败后如何处理该任务).
(3)原理:
A.如果此时线程池中的数量小于corePoolSize(核心池的大小),即使线程池中的线程都处于空闲状态,也要创建新的线程来处理被添加的任务(也就是说每来一个任务,就要创建一个线程来执行任务)
B.如果此时线程池中的数量大于等于corePoolSize ,但是缓冲队列workQueue未满,那么任务被放入缓冲队列,则该任务会等待空闲线程将其取出去执行。
C.如果此时线程池中的数量大于等于corePoolSize,缓冲队列也满了,但是线程池中的数量小于maximumPoolSize(线程池最大线程数),此时就会建新的线程来处理被添加的任务。D.如果此时线程池中的数量大于等于corePoolSize,缓冲队列满,线程池中的数量等于maximumPoolSize,那么通过RejectedExecutionHandler所指定的任务拒绝策略来处理此任务。 E.特别注意,在 corePoolSize 和 maximumPoolSize 之间的线程数会被自动释放。当线程池中线程数量大于 corePoolSize 时,如果某线程空闲时间超过 keepAliveTime,线程将被终止,直至线程池中的线程数目不大于 corePoolSize。这样,线程池可以动态的调整池中的线程数。
(4)类型:
Java提供了多种创建线程池的方式:
ExecutorService executors = Executors.newFixexThreadPool(3);创建固定大小的线程池,例子中只能放下3个线程
ExecutorService executors = Executors.newCachedThreadPool();创建可缓存的线程池,根据需要创建线程池,上限为操作系统的内存条大小
ExecutorService executors = Executors.newSingleThreadExecutor();创建单个线程的线程池
ScheduleExecutorService executors = Executors

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值