Java 线程有哪些基本状态? 这些状态是如何定义的?

1. 新建(new):

新创建了一个线程对象。

2. 可运行(runnable):

线程对象创建后,其他线程(比如main线程)调用了该对象的start()方法。该状态的线程位于可运行线程池中,等待被线程调度选中,获取cpu的使用权。

补充:为什么我们调用start()方法时会执行run()方法,为什么我们不能直接调用run()方法? 这是另一个非常经典的java多线程面试问题,而且在面试中会经常被问到。很简单,但是很多人都会答不上来!

new一个Thread,线程进入了新建状态;调用start()方法,会启动一个线程并使线程进入了就绪状态,当分配到时间片后就可以开始运行了。 start()会执行线程的相应准备工作,然后自动执行run()方法的内容,这是真正的多线程工作。 而直接执行run()方法,会把run方法当成一个mian线程下的普通方法去执行,并不会在某个线程中执行它,所以这并不是多线程工作。

总结: ''调用start方法方可启动线程并使线程进入就绪状态'',而run方法只是thread的一个普通方法调用,还是在主线程里执行。

3. 运行(running):

可运行状态(runnable)的线程获得了cpu时间片(timeslice),执行程序代码。

4. 阻塞(block):

阻塞状态是指线程因为某种原因放弃了cpu使用权,也即让出了cpu timeslice,暂时停止运行。直到线程进入可运行(runnable)状态,才有 机会再次获得cpu timeslice转到运行(running)状态。阻塞的情况分三种:

(一). 等待阻塞:

运行(running)的线程执行o.wait()方法,JVM会把该线程放 入等待队列(waitting queue)中。

(二). 同步阻塞:

运行(running)的线程在获取对象的同步锁时,若该同步锁已经被别的线程占用,则JVM会把该线程放入对象的锁池 (lock pool) 中。

备注:1. 关于锁池和等待池, 在Java中,每个对象都有两个池,锁(monitor)池和等待池 2. sleep()方法和wait()方法简单对比 (1). 两者最主要的区别在于:sleep方法没有释放锁,而wait方法释放了锁 。 (2). 两者都可以暂停线程的执行。 (3). wait通常被用于线程间交互/通信,sleep通常被用于暂停执行。 (4). wait()方法被调用后,线程不会自动苏醒,需要别的线程调用同一个对象上的 notify() (将线程从等待池转移到锁池中,使线程拥有了抢夺锁的机会) 或者 notifyAl() 方法。sleep() 方法执行完成后,线程会自动苏醒。

  1. 锁池:假设线程A已经拥有了某个对象(注意:不是类)的锁,而其它的线程想要调用这个对象的某个synchronized方法 (或者 synchronized块),由于这些线程在进入对象的 synchronized 方法之前必须先获得该对象的锁的拥有权,但是该对象的锁目前正被线程A拥有,所以这些线程进入到锁池中。只有进入到锁池中的线程才可以争夺对象锁。

  2. 等待池:假设一个线程A调用了某个对象的wait()方法,''线程A就会释放该对象的锁'' (因为 wait() 方法必须出现在 synchronized 中,这样自然在执行wait()方法之前线程A就已经拥有了该对象的锁),同时线程A就进入到了该对象的''等待池''中。等待池中的线程不会去竞争该对象的锁 。 如果另外的一个线程调用了相同对象的notifyAll()方法,那么处于该对象的等待池中的线程就会全部进入该对象的锁池中,准备争夺锁的拥有权。如果另外的一个线程调用了相同对象的notify()方法,那么仅仅有一个处于该对象的等待池中的线程 (随机) 会进入该对象的锁池. 注:wait() ,notifyAll(),notify() 三个方法都是Object类中的方法.

(三). 其他阻塞:

运行(running)的线程执行Thread.sleep(long ms)或t.join()方法,或者发出了I/O请求时,JVM会把该线程置为阻塞状态。当sleep()状态超时join()等待线程终止或者超时、或者I/O处理完毕时,线程重新转入可运行(runnable)状态。

5. 死亡(dead):

线程run()、main()方法执行结束,或者因异常退出了run()方法,则该线程结束生命周期。死亡的线程不可再次复生。

备注: 可以用早起坐地铁来比喻这个过程(下面参考自牛客网某位同学的回答):

  1. 还没起床:sleeping

  2. 起床收拾好了,随时可以坐地铁出发:Runnable

  3. 等地铁来:Waiting

  4. 地铁来了,但要排队上地铁:I/O阻塞

  5. 上了地铁,发现暂时没座位:synchronized阻塞

  6. 地铁上找到座位:Running

  7. 到达目的地:Dead

转载于:https://my.oschina.net/cughmy/blog/2052109

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值