初识线程---状态

多线程与高并发知识总结

线程

线程的概念

线程就是一个程序中的不同执行路径

创建线程的方式

  1. 继承 Thread 类,重写 run 方法。
  2. 实现 Runnable 接口,实现 run 方法。
  3. 线程池创建线程。

线程的状态

  1. 初始(NEW ):实现 Runnable 接口和继承Thread类可以得到一个线程类,new 一个实例出来,线程进入初状态;
  2. 运行(RUNNABLE):Java 线程中将就绪(ready)和运行中(running)两种状态统称为“运行”。
    • 线程对象创建后,其他线程(比如main线程)调用了该对象的start()方法。该状态的线程位于可运行线程池中,等待被线程调度选中,获取CPU的使用权,此时处于就绪状态(ready)。就绪状态只是说你有资格运行,调度程序没有挑选到你,你就永远是就绪状态。除了start()方法让线程进入就绪状态,下面三种情况也可以:
      1. 当前线程sleep()方法结束,其他线程join()结束,等待用户输入完毕,某个线程拿到对象锁,这些线程也将进入就绪状态。
      2. 当前线程时间片用完了,调用当前线程的yield()方法,当前线程进入就绪状态。
      3. 锁池里的线程拿到对象锁后,进入就绪状态。
  • 就绪状态的线程在获得CPU时间片后变为运行中状态(running)。
  1. 等待(WAITING):进入该状态的线程需要等待其他线程做出一些特定动作(通知或中断)。处于这种状态的线程不会被分配CPU执行时间,它们要等待被显式地唤醒,否则会处于无限期等待的状态。
  2. 超时等待(TIMED_WAITING):该状态不同于WAITING,它可以在指定的时间后自行返回。处于这种状态的线程不会被分配CPU执行时间,不过无须无限期等待被其他线程显示地唤醒,在达到一定时间后它们会自动唤醒。
  3. 阻塞(BLOCKED):是线程阻塞在进入synchronized关键字修饰的方法或代码块(获取锁)时的状态。
  4. 终止(TERMINATED):线程已终止,因为 run() 方法执行完毕。一旦终止,不能复生。
    在这里插入图片描述

线程的常用方法

  • sleep:睡眠,使当前线程进入 Waiting 状态(带超时时间,时间过了跳出等待状态)。
  • wait:线程进入waiting状态,需被唤醒(notify/notifyAll)或打断(Interrupt)方法跳出等待状态。
  • join:当前线程调用另一个线程的 join 方法,表示等待另一线程执行完毕后再执行当前线程。
  • notify:唤醒睡眠的线程
  • interrupt:打断等待状态的线程,打断后会抛出异常。需 catch 异常进行下一步操作。

Sychronized 锁升级的概念

锁的几种状态:

  1. 无锁状态:未有线程获取锁。
  2. 偏向锁:第一个获取该锁的线程,线程 id 会被记录到对象头上。表示该线程获取了锁。
  3. 自旋锁:当有其它线程跟当前线程争锁时,其他锁会在该锁中自旋(while 循环来访问该锁是否已经让出,尝试获取锁)10次。
  4. 重量级锁:当自旋10次之后未获取该锁,责会升级为重量级锁(OS锁 - 内核锁)。
小知识:什么时候使用自旋锁,什么时候使用重量级锁?

答:锁住的代码执行快,线程数少,使用自旋锁,代码执行慢,线程数多,使用重量级锁。(如果线程数多,超多线程使用 while 自旋会使CPU 压力过大,得不偿失。)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值