线程五种状态(新建、就绪、运行、阻塞、死亡)

线程的5种状态: 

每个 Java 程序都有一个缺省的主线程,对于 Java 应用程序,主线程是 main()方法执行的线索;

对于 Applet 程序,主线程是指挥浏览器加载并执行 Java Applet 程序的线索。要想实现多线程,

必须在主线程中创建新的线程对象。任何线程一般具有五种状态,即创建、就绪、运行、阻塞、终止。

1、新生状态

       在程序中用构造方法(new操作符)创建一个新线程时,如new Thread(r),该线程就是创建状态,

此时它已经有了相应的内存空间和其它资源,但是还没有开始执行。

2、就绪状态

       新建线程对象后,调用该线程的 start()方法就可以启动线程。当线程启动时,线程进入就绪状态(runnable)。

由于还没有分配CPU,线程将进入线程队列排队,等待 CPU 服务,这表明它已经具备了运行条件。当系统挑选一个

扫描二维码关注公众号,回复: 4803014 查看本文章

等待执行的Thread对象后,它就会从等待执行状态进入执行状态。系统挑选的动作称之为“CPU调度"。一旦获得CPU

线程就进入运行状态并自动调用自己的run方法。

3、运行状态

       当就绪状态的线程被调用并获得处理器资源时,线程就进入了运行状态。此时,自动调用该线程对象的 run()方法。

 run()方法定义了该线程的操作和功能。运行状态中的线程执行自己的run方法中代码。直到调用其他方法或者发生阻塞

而终止。

4、阻塞状态

       一个正在执行的线程在某些特殊情况下,如被人为挂起或需要执行耗时的输入输出操作时,将让出 CPU 并暂时中止

自己的执行,进入堵塞状态。在可执行状态下,如果调用 sleep()、 suspend()、 wait()等方法,线程都将进入堵塞状态。

堵塞时,线程不能进入排队队列,只有当引起堵塞的原因被消除后,线程转入就绪状态。重新到就绪队列中排队等待,

这时被CPU调度选中后会从原来停止的位置开始继续执行。

      记住:阻塞被消除后是回到就绪状态,不是运行状态。

5、死亡状态

      线程调用 stop()方法、destory()方法或 run()方法执行结束后,线程即处于死亡状态。处于死亡状态的线程不具有继续运行的能力。

可以通过getState()方法来获取线程当前的状态:NEW 、RUNNABLE、BLOCKED、WAITING、TIMED_WAITING、TERMINATED

常见问题:

1、造成线程阻塞的方法?

阻塞线程的方法:join、yield、sleep 和Object的wait()方法

2、Java的守护进程(后台进程)?

设置线程为后台进程运行:setDaemon(true) 如果一个进程中只有后台线程在运行,这个进程就会结束。

3、造成线程阻塞后,线程回到哪个状态了?

通过join、yield、sleep造成线程阻塞后是回到了就绪状态

3、哪些状态之后是回到就绪状态?

 a)通过join、yield、sleep造成线程阻塞后是回到了就绪状态

 b)遇到synchronized后

 c)遇到Object的等待wait方法后

4、sleep会释放锁吗?

 sleep不会释放锁【它会抱着锁睡觉】

5、线程都有哪些状态?具体是怎么运行的?

线程有:创建、就绪、运行、阻塞、终止。5种状态

1.通过new关键字创建后,进入到新生状态

2.调用start后进入就绪状态

3.CPU调度到本线程后,本线程开始执行。进入到运行状态

4.运行中遇到join,yield,sleep造成阻塞,进入阻塞状态。阻塞完成后,又回到就绪状态

5.线程正常执行完,或者遇到异常终止后,进入死亡状态

6、终止线程有哪几种方法?

 线程调用 stop()方法、destory()方法或 run()方法执行结束后,线程即处于死亡状态。处于死亡状态的线程不具有继续运行的能力。

 推荐使用boolen标识来停止线程

猜你喜欢

转载自blog.csdn.net/wordwarwordwar/article/details/85924858