线程状态和方法

线程状态:

1.start():就绪,处于这个状态的线程位于Java虚拟机的可运行池中,等待cpu的使用权
2.运行,只有一个cpu只有一个线程是处于这个状态中
3.阻塞:放弃cpu的持有,暂时停止运行,java虚拟机不会分配cpu,直到重新进入就绪状态
分为3种:
1.等待阻塞:运行的线程执行wait()方法,JVM会把该线程放入等待池中,当到了指定时间或调用notify()方法时,进入可执行状态。
(属于Object类,而不属于Thread类,wait()会先释放锁住的对象,然后再执行等待的动作。由于wait()所等待的对象必须先锁住,
因此,它只能用在同步化程序段或者同步化方法内,否则,会抛出异常IllegalMonitorStateException
2.同步阻塞:运行的线程在获取对象同步锁时,若该同步锁被别的线程占用,则JVM会把线程放入锁池中
3.其他阻塞:运行的线程执行Sleep()方法,或者发出I/O请求时,JVM会把线程设为阻塞状态。
当Sleep()状态超时、或者I/O处理完毕时,线程重新转入就绪状态
唤醒方法:
1.suspend() 和 resume() 方法,挂起和唤醒线程,suspend e()使线程进入阻塞状态,
只有对应的resume e()被调用的时候,线程才会进入可执行状态。(不建议用,容易发生死锁)
2.yield() 方法:会使的线程放弃当前分得的cpu时间片,但此时线程任然处于可执行状态,随时可以再次分得cpu时间片。
yield()方法只能使同优先级的线程有执行的机会。调用(暂停当前正在执行的线程,并执行其他线程,且让出的时间不可知)
3.join()方法:线程加入。是当前线程A调用另一个线程B的join()方法,当前线程转A入阻塞状态,直到线程B运行结束,
线程A才由阻塞状态转为可执行状态
4.中断:interrupt(),用于中止正在被阻塞的任务。当打断一个正在被阻塞的任务时,通常还需要清理资源,
比如Java在设计阻塞时中断方法时,即在调用interrupt()设置线程为中断状态后,如果线程遇到阻塞就会抛出InterruptedException异常,
并且将会重置线程的中断状态,如果线程正处于阻塞状态,调用interrupt()方法,会立马打断阻塞并抛出异常

5.死亡状态:当线程执行完run()方法中的代码,或者遇到了未捕获的异常,就会退出run()方法,此时就进入死亡状态,该线程结束生命周期

注意:如果线程是因为调用了wait()、sleep()或者join()方法而导致的阻塞,可以中断线程,并且通过抛出InterruptedException来唤醒它;
如果线程遇到了IO阻塞,无能为力,因为IO是操作系统实现的
另外:其中wait() 和notify()是其中功能最强大、使用最灵活的方法,但这也导致了它们效率较低、较容易出错的特性

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值