并发编程-并发,线程与等待机制(1)

本文详细介绍了Java中线程的状态,包括初始、运行、阻塞、等待、超时等待和终止六种状态及其转换。此外,还探讨了线程的优先级、调度策略,以及用户线程与内核线程的实现方式。文章进一步讨论了Java中线程调度的抢占式特点,并提到了协程的概念,包括纤程和Quasar库的实践。最后,文章简要提及了守护线程、线程间的通信以及join方法的使用。
摘要由CSDN通过智能技术生成

线程的状态/生命周期

Java中线程的状态分为6种:

1. 初始(NEW):新创建了一个线程对象,但还没有调用start()方法。

2. 运行(RUNNABLE):Java线程中将就绪(ready)运行中(running)两种状态笼统的称为“运行”。

        线程对象创建后,其他线程(比如main线程)调用了该对象的start()方法。该状态的线程位于可运行线程池中,等待被线程调度选中,获取CPU的使用权,此时处于就绪状态(ready)。就绪状态的线程在获得CPU时间片后变为运行中状态(running)。

3. 阻塞(BLOCKED):表示线程阻塞于锁(在当前java中只有synchornized能够让其阻塞)

4. 等待(WAITING):进入该状态的线程需要等待其他线程做出一些特定动作(通知或中断)

5. 超时等待(TIMED_WAITING):该状态不同于WAITING,它可以在指定的时间后自行返回。

6. 终止(TERMINATED):表示该线程已经执行完毕。

0

状态之间的变迁如下图所示

0

掌握这些状态可以让我们在进行Java程序调优时可以提供很大的帮助。

其他的线程相关方法

yield()方法:使当前线程让出CPU占有权,但让出的时间是不可设定的。也不会释放锁资源。同时执行yield()的线程有可能在进入到就绪状态后会被操作系统再次选中马上又被执行。

比如,ConcurrentHashMap#initTable 方法中就使用了这个方法,

0

        这是因为ConcurrentHashMap中可能被多个线程同时初始化table,但是其实这个时候只允许一个线程进行初始化操作,其他的线程就需要被阻塞或等待,但是初始化操作其实很快,这里Doug Lea大师为了避免阻塞或者等待这些操作引发的上下文切换等等开销,就让其他不执行初始化操作的线程干脆执行yield()方法,以让出CPU执行权,让执行初始化操作的线程可以更快的执行完成。

        wait()/notify()/notifyAll():后面会单独讲述

线程的优先级

        在Java线程中,通过一个整型成员变量priority来控制优先级,优先级的范围从1~10,在线程构建的时候可以通过setPriority(int)方法来修改优先级,默认优先级是5,优先级高的线程分配时间片的数量要多于优先级低的线程。

        设置线程优先级时,针对频繁阻塞休眠或者I/O操作)的线程需要设置较高优先级,而偏重计算需要较多CPU时间或者偏运算)的线程则设置较低的优先级,确保处理器不会被独占。在不同的JVM以及操作系统上,线程规划会存在差异,有些操作系统甚至会忽略对线程优先级的设定。

线程的调度

        线程调度是指系统为线程分配CPU使用权的过程,主要调度方式有两种

        协同式线程调度(Cooperative Threads-Scheduling)

        抢占式线程调度(Preemptive Threads-Scheduling)

        使用协同式线程调度的多线程系统,线程执行的时间由线程本身来控制,线程把自己的工作执行完之后,要主动通知系统切换到另外一个线程上。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

长情知热爱

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值