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()方法来获取线程当前的状态。
有的还有个超时等待
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标识来停止线程。
全部评论
(1) 回帖