线程生命周期的控制
任何事务都有一个生命周期,线程也不例外。那么在一个程序中,怎样控制一个
线程的生命并让它更有效地工作呢?要想控制线程的生命,先得了解线程产生和消亡
的整个过程。线程的声明周期如下所示
线程的生命周期
控制线程生命周期的方法有很多种,如:suspend 方法、resume 方法和 stop 方法。但这三个方法都不推荐使用,其中,不推荐使用 suspend 和 resume 的原因是:
(1)、会导致死锁的发生。
(2)、它允许一个线程(甲)通过直接控制另外一个线程(乙)的代码来直接控制
那个线程(乙) 。
虽然 stop 能够避免死锁的发生,但是也有其它的不足:如果一个线程正在操作共
享数据段,操作过程没有完成就被“stop”了的话,将会导致数据的不完整性。
那么怎么控制线程的声明周期呢?
通过控制 run 方法中循环条件的方式来结束一个线程的方法是推荐使用的,这也是实际用的最多的方法。
代码实例:
public class TestThread implements Runnable{ private boolean bFlag = true ; public void stopMe() { bFlag = false ; } publicvoid run() { while (bFlag) { System.out.println( Thread.currentThread().getName() +"在运行!"); } } } public class Threadlife { publicstatic void main(String[] args) { TestThread t = new TestThread(); new Thread(t).start(); for( int i = 0; i < 10 ; i++ ) { if( i == 5) t.stopMe(); System.out.println("main 线程在运行!"); } } }
多线程中重要的知识点:
1、线程(thread)是指程序的运行流程。 “多线程”的机制可以同时运行多个程序块,使程序运行的效率更高,也解决了传统程序设计语言所无法解决的问题。
2、如果在类里要激活线程,必须先做好下面两项准备:
(1) 、此类必须是扩展自 Thread 类,使自己成为它的子类。
(2) 、线程的处理必须编写在 run()方法内。
3、 run()方法是定义在 Thread 类里的一个方法,因此把线程的程序代码编写在 run()方法内,所做的就是覆盖的操作。
4、 Runnable 接口里声明了抽象的 run()方法,因此必须在实现Runnable 接口的类里明确定义 run()方法。
5、每一个线程,在其创建和消亡之前,均会处于下列五种状态之一:创建、就绪、运行、阻塞、终止。
6、暂停状态的线程可由下列的情况所产生:
(1)该线程调用对象的 wait()时。
(2)该线程本身调用 sleep()时。
(3)该线程和另一个线程 join()在一起时。
7、被冻结因素消失的原因有:
(1) 如果线程是由调用对象的 wait()方法所冻结, 则该对象的 notify()方法被调用
时可解除冻结。
(2)线程进入休眠(sleep)状态,但指定的休眠时间到了。
8、当线程的 run()方法运行结束,或是由线程调用它的 stop()方法时,则线程进入消亡状态。
9、 Thread 类里的 sleep()方法可用来控制线程的休眠状态,休眠的时间要视 sleep()里的参数而定。
10、要强制某一线程运行,可用 join()方法。
11、join()方法会抛出InterruptedException 的异常,所以编写时必须把 join()方法编写在 try-catch 块内。
12、当多个线程对象操纵同一共享资源时,要使用 synchronized 关键字来进行资源的同步处理。