[操作系统] 线程5种状态详解及常见问题解决

1 线程的概念

线程是进程的子任务,是CPU调度和分派的基本单位,用于保证时序的实时性,实现进程内部的并发。

线程是进程的一个实体,是CPU调度和分派的基本单位,它是比进程更小的能独立运行的基本单位。
线程自己基本上不拥有系统资源,只拥有一点在运行中必不可少的资源(如程序计数器、一组寄存器和栈),但是它可与属于同一个进程的其他线程共享进程的全部资源。

2 线程的5种状态

每个Java 程序都有一个缺省的主线程,对于Java程序,主线程是main()方法执行的线索
对于Applet程序,主线程是指浏览器加载并执行 Java Applet程序的探索。
要想实现多线程,必须在主线程中创建新的线程对象。

任何线程一般都具有五种状态,即创建、就绪、运行、阻塞、终止。

  • (1) 新生状态
    在程序中用构造方法(new操作符)创建一个新线程时,如new Thread(r),该线程就是创建状态,此时它已经有了相应的内存空间和其它资源,但是还没有开始执行。

  • (2)就绪状态
    新建线程对象后,调用该线程的start()方法就可以启动线程。当线程启动时,线程就进入就绪状态(runnable)
    由于还没有分配CPU,线程将进入线程队列排队,等待CPU服务,这表明它已经具备了运行条件。
    当系统挑选一个等待执行的Thread对象后,它就会从等待状态进入执行状态。系统挑选的动作称之为“CPU调度”。
    一旦获得CPU,线程就进入运行状态并自动调用自己的run方法。

  • (3)运行状态
    当就绪状态的线程被调用并获得处理器资源时,线程就进入了运行状态。此时,自动调用该线程对象的run()方法。
    run()方法定义了该线程的操作和功能。运行状态中的线程执行自己的run方法中的代码,直到调用其它方法或者发生阻塞而终止。

  • (4)阻塞状态
    一个正在执行的线程在某些特殊情况下,如被人为挂起或需要执行耗时的输入输出操作时,将让出CPU并暂时中止自己的执行,进入堵塞状态。

在可执行状态下,如果调用sleep()、suspend()、wait()等方法,线程都将进入阻塞状态。
堵塞时,线程不能进入排队队列,只能当引起阻塞的原因被消除后,线程转入就绪状态,重新到就绪队列中排队等待,这时被CPU调度选中后会从原来停止的位置开始继续执行。

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

  • (5)死亡状态
    线程调用stop()方法,destory()方法或run()方法执行结束后,线程即处于死亡状态。
    处于死亡状态的线程不具有继续运行的能力。可以通过getState()方法来获取线程当前的状态。

有的还有个超时等待
处于这种状态的线程不会被分配CPU执行时间,不过无须无限期的等待被其它线程显式的唤醒,在达到一定时间之后它们会自动唤醒。

3 常见问题

  • (1) 造成线程阻塞的方法?
    阻塞线程的方法:join、yield、sleep和Object的wait()方法

  • (2) Java的守护进程(后台进程)?
    设置线程为后台进程运行,setDaemon(true)。如果一个进程中只有后台线程在运行,这个进程就会结束。

  • (3)造成线程阻塞后,线程回到了哪个状态了?
    通过join、yield、sleep造成线程阻塞后是回到了就绪状态。

  • (4)哪些状态之后是回到了就绪状态?
    a)通过join、yield、sleep造成线程阻塞后是回到了就绪状态
    b)遇到synchronized后
    c)遇到Object的等待wait方法后

  • (5)sleep 会释放锁吗?
    sleep不会释放锁【它会抱着锁睡觉】

  • (6) 线程都有哪些状态?具体是怎么运行的
    线程有:创建、就绪、运行、阻塞、终止 五种状态。
    a)调用new关键字创建后,进入到新生状态
    b)调用start后进入就绪状态
    c)CPU调度到本线程后,本线程开始执行,进入到运行状态
    d)运行中遇到join,yield,sleep造成阻塞,进入阻塞状态。阻塞完成后,又回到就绪状态
    e)线程正常执行完,或者遇到异常终止后,进入死亡状态。

  • (7) 终止线程有哪几种方法?
    线程调用stop()方法, destory()方法或run()方法执行结束后,线程即处于死亡的状态。
    处于死亡状态的线程不再具有继续运行的能力。
    推荐使用boolen标识来停止线程。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章