线程的状态与控制

线程的状态与控制

一个线程被创建后就进入了线程的生命周期。在线程的生命周期中,共包含新建(New)、就绪(Runnable)、运行(Running)、阻塞(Blocked)和死亡(Dead)这五种状态。当线程启动以后,CPU需要在多个线程之间切换,所以线程也会随之在运行、阻塞、就绪这几种状态之间切换。线程的状态转换如下图所示:

在这里插入图片描述

当使用new关键字创建一个线程对象后,该线程就处于新建状态。此时的线程就是一个在堆中分配了内存的静态的对象,线程的执行体(run方法的代码)不会被执行。

当调用了线程对象的start()方法后,该线程就在就绪状态。此时该线程并没有开始运行,而是处于可运行池中,JVM会为该线程创建方法调用堆栈和程序计数器。至于该线程何时运行,要取决于JVM调度。

一旦处于就绪状态的线程获得CPU开始运行,该线程就进入运行状态。线程运行时会执行run方法的代码。对于抢占式策略的操作系统,系统会为每个可执行的线程分配一个时间片,该时间片用尽后,系统会剥削该线程所占的处理器资源,从而让其他线程获得占有CPU的机会。此时该线程会从运行态转为就绪态。

当一个正在运行的线程遇到如下情况时,线程会从运行态变为阻塞态:

  1. 线程调用sleep、join等方法
  2. 线程调用了一个阻塞时IO方法
  3. 线程试图获得一个同步监视器,但是该监视器正在被其他线程持有。
  4. 线程正在等待某个notify通知
  5. 程序调用了线程的suspend方法将该线程挂起

当线程被阻塞后,其他线程就有机会获得CPU资源而被执行。当上述导致线程被阻塞的因素解除后,线程会回到就绪状态等待处理机调度而被执行。

当一个线程执行结束后,该线程进入死亡状态。有以下三种方法可以结束一个线程。

  1. run方法执行完毕
  2. 线程抛出一个异常或错误,而该异常或错误未被捕获
  3. 调用线程的stop方法结束该线程

线程的控制

Thread类中提供一些控制线程的方法,通过这些方法可以轻松的控制一个线程的执行和运行状态,以达到程序的预期效果。

join方法

如果线程A调用了线程B的Join方法,线程A被阻塞,等待线程B执行完毕后线程A才会被执行。这里需要注意的一点是,join方法必须在线程B的start方法调用之后调用才有意义。

join方法的主要作用就是实现线程之间的同步,它可以使线程之间的并发执行变为串行执行

join方法有以下3种重载形式

  1. join():等待被join的线程执行完成
  2. join(long millis):等待被join的线程时间为millis毫秒,如果该线程在millis毫秒内未结束,则不在等待。
  3. join(long millis,int nanos):等待被join的线程的时间最长为millis毫秒加上nanos毫秒

sleep方法

当线程A调用了sleep方法,则线程A将被阻塞,直到执行睡眠的时间到达后,线程A才会被重新挂起,进入就绪专改。

sleep方法有以下2种重载方式

  1. sleep(long millis):让当前正在执行的线程展厅millis毫秒,该线程进入阻塞状态。
  2. sleep(long mulls,long nanos):让当前正在执行的线程展厅millis毫秒加上nanos微妙。

yield方法

当线程A调用了yield方法,它可以暂时放弃处理器,但是线程A不会被阻塞,而是进入就绪状态。

设置线程的优先级

每个线程都有自己的优先级,默认情况下线程的优先级都与创建该线程的父线程的优先级相同。同时Thread类提供了setPrioriry(int priority)和getPriority()方法设置和放回指定线程的优先级。参数prioriry是一个整形数据,用以指定线程的优先级。priority的取值范围为1~10,也可以使用Thread类提供的三个静态常量设置线程的优先级。

  1. MAX_PRIORITY:最高优先级,其值为10
  2. MIN_PRIORITY:最低优先级,其值为1
  3. NORM_PRIORITY:普通优先级,其值为5
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值