Java并发基础(五)——线程的状态

线程与进程

线程是轻量级的进程,是程序执行的最小单位。进程是系统进行资源分配和调度的基本单位。之所以使用多线程去进行并发程序的设计,是因为线程间的切换和调度的成本远远低于进程。

下面说明线程的6种状态,但并不说明因Java中线程的方法导致线程状态的变化,会在后面专门具体介绍方法。如果对方法理解掌握了,自然就明白了某个方法的执行会怎样引起线程状态的变化。

 

线程的状态

 

NEW(创建)

实现Runnable接口或继承Thread类都可以得到一个线程(还有其它得到线程的方法),当new一个实例后,线程进行初始状态。简而言之,就是表示线程刚刚创建,但还没开始运行。当调用start()方法进行就绪状态后,就不能再回到创建状态了。

 

可运行(Runnable)

具体来说包含了就绪和运行中两种状态。就绪(ready)就是说该线程具体运行的资格条件了,但系统在调度中没有选中它,但只选中就可以执行。当线程的start()方法调用时,表示线程可以开始运行了,进入就绪状态。以下4种操作,皆会进行就绪状态:

  1. 调用线程的start方法,该线程就进入了就绪状态;
  2. 当调用sleep()方法结束,其它线程join()结束,等待用户输入完毕,某个线程拿到锁,线程就进入就绪状态;
  3. 当前线程时间片用完了,调用该线程的yield()方法,当前线程进行就绪状态;
  4. 锁池中的线程拿到对象锁后,进入就绪状态

运行(running),就是系统调度从处于就绪状态的线程中挑选一个线程,选中的线程就开始运行。这个挑中的线程运行了,就处于运行状态,其它未挑中的线程仍然处于就绪状态。就绪和运行都是可运行的状态。

PS一下:时间片【timeslice】:又称为量子(quantum)或处理器片(processor slice),是分时操作系统分配给每个正在运行的进程微观上的一段CPU时间(在抢占内核中是从进程开始运行直到被抢占的时间)。具体参见时间片-百度百科

 

阻塞(Blocking)

线程在运行过程中,遇到了synchronized关键字修饰的同步代码块,就会进行阻塞状态。此时该线程会暂停执行,直到获得锁。就是说因为有锁而发生阻塞。

 

等待(WAITING)

具体来说,等待的线程它们空间是在等啥呢?一般来说,WAITING的线程正是在等待一些特殊的事件。比如 ,通过wait()方法等待的线程在等待nofity()方法,而通过join()方法等待的线程则会等待目标线程的终止。一旦等到了期望的事件,线程就会再次执行,进入RUNNABLE状态。当线程执行完毕后,则进入TERMINATED状态,表示此线程终止。

从另一个方面来说,处于状态状态的线程不会被调度分配CPU执行时间,要等待被显式的唤醒,否则就一直等待,即可能进入无限等待。

 

超时等待(TIMED_WAITING)

超时等待的线程也不会被分配CPU执行时间,不过不需要无限的等待,在达到一定时间后会自动唤醒。

 

等待和超时等待的区别

等待(WAITING)和超时等待(TIMED_WAITING)都表示等待状态。它们的区别是WAITING会进入一个没有时间限制的等待,也就是说这个等待可能很久;TIMED_WAITING的等待是有限时的。

 

终止(TERMINATED)

当一个线程的run()方法执行完成了,或者主线程的main()方法完成了,就认为它终止了。线程对象可能还存在,但它已然不再是一个单独执行的线程。需要注意的是,线程一旦终止,就不能再恢复。

 

其实在Thread类中有也状态定义,Thread类包含了一个枚举State,如下截图。

一共定义了阻塞、新建、可运行、等等、超时等等和死亡6种。

 

注:《实战Java高并发程序设计(第2版)》。

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值