Java线程生命周期以及方法

线程生命周期

当线程被创建之后并不是立马执行,也不是一直处于执行状态。线程经历了五种状态,这就是它的生命周期。新建(new)、就绪(runnable)、运行(running)、阻塞(blocked)、死亡(dead)。线程执行会在运行和阻塞状态之间来回切换。

  1. 新建(new)
    当线程使用new关键字创建之后,该线程处于新建状态,此时由jvm分配内存,并初始化其成员变量的值。

  2. 就绪(runnable)
    当线程调用了start()方法后,该线程处于就绪状态。Java虚拟机会为其创建方法调用栈,等待程序调动。

  3. 运行(running)
    如果就绪的线程获得了cpu,开始执行run()方法,则线程处于运行状态。

  4. 阻塞(blocked)
    阻塞状态是指线程由于某种原因放弃了cpu使用权,暂时停止运行,等重新获取到cpu资源时,重新进入运行状态。
    阻塞的状态分三种:
    等待阻塞:当线程执行了wait()方法,jvm会把线程放入等待队列。
    同步阻塞:运行的线程获取到对象的同步锁时,若该同步锁被其他线程占用,则jvm会把线程放入锁池中。
    其他阻塞:线程调用了sleep()或者join()方法,jvm会把线程设置为阻塞状态。

  5. 死亡(dead)
    当线程结束后就是死亡状态,有下面三种情况:
    正常结束:
    run()方法获知call()执行完毕,线程正常结束。
    异常结束:
    线程抛出异常Exception或者Error。
    调用stop()方法:
    线程直接调用stop()方法。容易产生死锁,不推荐使用。

线程常用的几种方法

- sleep(时间):
让当前线程睡眠释放当前cpu资源,当时间结束时,线程重新启动,不会释放锁资源。
- yield():
让当前线程停下来,把资源让给其他线程,自己重新进入就绪状态。

- start():
使当前线程进入到就绪状态,等待分配到cpu资源再执行。
- join():
当前的线程加入你调用的线程,当调用的线程执行完毕当前线程再运行,保证了线程的前后顺序。
- wait():
使当前线程阻塞,前提是必须获取锁,一般配合synchronized代码中使用,执行了wait()方法需要其他线程调用notify方法来唤醒。会释放锁资源。
- notify()、notifyAll():
唤醒调用了wait()方法的线程,通知继续运行。

相关扩展

- wait()和sleep()的区别:
sleep()属于Thread类中的而wait()属于Object类中的。
sleep()不会释放锁资源而wait()会释放锁资源。
sleep()等睡眠时间结束线程重新进入运行状态而wait()则线程进入等待锁定池中只有调用notify()才能重新进入到运行状态。
- start()和run()的区别:
start()方法启动线程,使线程进入到就绪状态,真正实现了多线程。run()方法包含了这个线程的执行内容,run()方法结束,当前线程终止。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值