JAVA多线程二:线程的六种状态及常用方法

一、线程的六种状态以及转化

1、线程的生命周期

1)New(新建状态):new Thread()创建一个Thread对象
2)Runnable(就绪状态):线程对象此时调用start方法,此时在JVM进程中创建了一个线程
3)Blocked(阻塞状态):等到一个监视器锁进入到同步代码块或者同步方法中,没有获取到lock时等待的线程会从Runnable状态转化为Blocked状态
4)Waiting(等待状态):调用Object.wait()/join()/LockSupport.park()等方法,此时线程从Runnable状态转换到Waiting状态
5)Timed_Waiting(睡眠状态):调用带超时参数的Thread.sleep(long millis)/Object.wait(long timeout)/join(long milles)/LockSupport.parkNanos()/LockSupport.parkUntil等方法都会使得当前线程进入到Timed_Waiting状态
6)Terminated(终止状态): 是线程的最终状态,说明线程生命周期结束

进入Terminated状态的情况

1、线程运行完毕,结束生命周期
2、线程在运行过程中出现错误,意外结束
3、JVM crash,导致所有的线程都结束

2、图解线程的六种状态以及转化

在这里插入图片描述

二、线程中常用的方法

1、start() 方法

start() 方法用来启动一个线程,将其添加一个线程组当中,此时线程就会处于Runnable就绪状态。

2、sleep()方法

sleep()方法是将当前线程指定休眠时间,进入到休眠状态,暂停执行,不会放弃monitor锁的使用权。
TimeUnit和sleep方法类似,对sleep方法对其进行了封装省去了时间单位换算的步骤。

3、yield()方法

yield()是一种启发式方法,线程A.yield(),会提醒调度器线程A愿意放弃本次的cpu资源,如果cpu资源不紧张,处理器有可能会忽略这种提示。
yield()方法和sleep()方法的区别:
1)sleep()方法不会放弃cpu时间片,只是是当前线程暂停执行。
2)sleep()方法使用interrupt捕捉中断信号,yield()方法不会。
3)yield()方法放弃cpu时间片是不确定的,如果cpu资源不紧张,处理器有可能会忽略这种提示。
4)yield()方法会使线程从Running状态转化为Runnable状态。

4、join()方法

线程A调用join()方法会使线程A所处的线程B进入到等待状态,直到线程A执行完毕或达到join方法的超时时间,线程B才可以执行。

5、中断方法

1)interrupt() 将java线程当中的中断状态位置为true
2)sleep()/join()/wait throw InterruptedException 可中断方法
3)isInterrupted() 判断中断状态位是否位true
4)interrupted() 判断中断状态位是否为true

6、wait/notify/notifyAll

1)wait调用该synchornized同步代码块或方法当中,使得当前线程进入阻塞状态。
2)notify/notifyAll唤醒当前的阻塞。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值