并发篇:线程状态和线程池

并发篇:线程状态和线程池


线程状态

Java 线程六种状态

在这里插入图片描述

步骤(结合上图):

正常:

New新建——>start——>可运行状态——>操作系统交给cpu——>。。。。。——>完成运行,终结状态


阻塞:

cpu运行——>获取锁失败——>阻塞——>cpu运行阻塞代码——>当前面释放锁后,唤醒阻塞线程——>获取锁成功——>运行


等待:

cpu运行——>获取锁——>不满足某些条件——>等待状态,交给其它线程先运行——>满足条件后,另一个线程来唤醒等待线程——>运行


等待(有时限):
  • 获取锁wait(long):(到期时间和notify两种唤醒)
    long 毫秒值
  1. cpu运行——>获取锁——>不满足某些条件——>等待状态,交给其它线程先运行——>时间到达,自己唤醒自己——>运行

  2. cpu运行——>获取锁——>不满足某些条件——>等待状态,交给其它线程先运行——>满足条件后,另一个线程来唤醒等待线程——>运行

  • sleep(long):
    long 毫秒值
  1. cpu运行——>睡眠——>等待状态,交给其它线程先运行——>时间到达,自己唤醒自己——>运行


正常执行线程

在这里插入图片描述
提示:main为主线程,t1为自定义的一个线程

t1线程到达runnable 才可以执行,所以输出了 running… ,t1线程结束后,状态变为终结状态, 如果不理解的可以对着状态图来


阻塞

在这里插入图片描述
输出
在这里插入图片描述

main先获取Lock, t2获取锁失败,处于阻塞,当主线main释放锁后, t2线程获取锁,输出in sync


等待

在这里插入图片描述


从操作层面上,Java线分为了五种状态

在这里插入图片描述

解释

  1. 分到CPU时间的:
  2. 运行可以分到CPU时间的:就绪
  3. 分不到CPU时间的:阻塞
  • 运行态:分到 cpu 时间,能真正执行线程内代码的
  • 就绪态:有资格分到 cpu 时间,但还未轮到它的
  • 阻塞态:没资格分到 cpu 时间的
    • 涵盖了 java 状态中提到的阻塞等待有时限等待
    • 多出了阻塞 I/O,指线程在调用阻塞 I/O 时,实际活由 I/O 设备完成,此时线程无事可做,只能干等
  • 新建与终结态:与 java 中同名状态类似,不再啰嗦

线程池

在这里插入图片描述

七大参数

  1. corePoolSize 核心线程数目 - 池中会保留的最多线程数
  2. maximumPoolSize 最大线程数目 - 核心线程+救急线程的最大数目
  3. keepAliveTime 生存时间 - 救急线程的生存时间,生存时间内没有新任务,此线程资源会释放
  4. unit 时间单位 - 救急线程的生存时间单位,如秒、毫秒等
  5. workQueue - 当没有空闲核心线程时,新来任务会加入到此队列排队,队列满会创建救急线程执行任务
  6. threadFactory 线程工厂 - 可以定制线程对象的创建,例如设置线程名字、是否是守护线程等
  7. handler 拒绝策略 - 当所有线程都在繁忙,workQueue 也放满时,会触发拒绝策略
    1. 抛异常 java.util.concurrent.ThreadPoolExecutor.AbortPolicy
    2. 由调用者执行任务 java.util.concurrent.ThreadPoolExecutor.CallerRunsPolicy
    3. 丢弃任务 java.util.concurrent.ThreadPoolExecutor.DiscardPolicy
    4. 丢弃最早排队任务 java.util.concurrent.ThreadPoolExecutor.DiscardOldestPolicy

执行步骤:

  1. 如果核心线程满了,加入队列中
  2. 核心线程执行完一个任务,从队列中取一个出来,队列就空了一个
  3. 如果队列满了,核心线程也满了,创建救急线程来执行,执行任务完后,此线程会在特定时间后释放线程资源
  4. 如果队列满了,核心线程,救急线程也满了,将采用拒绝策略:一共有四种

代码演示:

在这里插入图片描述
在这里插入图片描述

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值