Java 中线程死亡的几种情况实例分析
这里有新鲜出炉的 Java 函数式编程, 程序狗速度看过来!
Java 程序设计语言
java 是一种可以撰写跨平台应用软件的面向对象的程序设计语言, 是由 Sun Microsystems 公司于 1995 年 5 月推出的 Java 程序设计语言和 Java 平台 (即 JavaEE(j2ee), JavaME(j2me), JavaSE(j2se)) 的总称
线程是进程中的一个实体, 是被系统独立调度和分派的基本单位, 线程自己不拥有系统资源, 只拥有一点在运行中必不可少的资源, 但它可与同属一个进程的其它线程共享进程所拥有的全部资源下面这篇文章主要给大家介绍了 Java 线程死亡的几种情况, 需要的朋友可以参考下
Java 线程会议如下三种方式结束, 结束后就处于死亡状态
1run()或者 call()方法执行完成, 线程正常结束;
2 线程抛出一个未捕获的 Exception 或 Error;
3 直接调用该线程的 stop()方法来结束该线程;
注意: 当主线程结束时, 其他线程不受任何影响, 并不会随之结束一旦子线程启动起来后, 它就拥有和主线程相同的地位, 不会受到主线程结束的影响
为了测试某个线程是否已经死亡, 可以调用线程对象的 isAlive()方法, 当线程处于就绪运行阻塞三种状态时, 该方法将返回 true; 当线程处于新建死亡两种状态时, 该方法就返回 false
如下对线程死亡情况的 1 和 2 进行测试
主线程的代码如下:
- public class ThreadTest {
- public static void main(String[] args) throws InterruptedException {
- Thread t = new Thread(new RunTask());
- t.start();
- while (true) {
- Thread.sleep(1000);
- System.out.println("主线程: 子线程状态为" + t.isAlive());
- }
- }
- }
测试 1: 线程正常结束后, isAlive()返回 False
编写线程正常结束的线程执行代码:
- public class RunTask implements Runnable {
- @Override
- public void run() {
- for (int idx = 1; idx <= 10; idx++) {
- System.out.println("子线程: 我还活着" + idx);
- try {
- Thread.sleep(3000);
- } catch (InterruptedException e) {
- e.printStackTrace();
- }
- }
- }
- }
两个线程的输出结果如下所示, 显示子线程正常执行结束后, 使用 Thread.isAlive()就返回 False 了
主线程: 子线程状态为 true
主线程: 子线程状态为 true
子线程: 我还活着 8
主线程: 子线程状态为 true
主线程: 子线程状态为 true
主线程: 子线程状态为 true
子线程: 我还活着 9
主线程: 子线程状态为 true
主线程: 子线程状态为 true
主线程: 子线程状态为 true
子线程: 我还活着 10
主线程: 子线程状态为 true
主线程: 子线程状态为 true
主线程: 子线程状态为 true
主线程: 子线程状态为 false
主线程: 子线程状态为 false
主线程: 子线程状态为 false
主线程: 子线程状态为 false
主线程: 子线程状态为 false
测试 2: 子线程抛出异常之后, 线程的 isAlive()返回 False
修改子线程的代码, 加入异常抛出:
- public class RunTask implements Runnable {
- @Override
- public void run() {
- for (int idx = 1; idx <= 10; idx++) {
- System.out.println("子线程: 我还活着" + idx);
- try {
- Thread.sleep(3000);
- } catch (InterruptedException e) {
- e.printStackTrace();
- }
- if (idx == 5) {
- throw new RuntimeException("i am die");
- }
- }
- }
- }
再次执行, 观察输出:
主线程: 子线程状态为 true
主线程: 子线程状态为 true
主线程: 子线程状态为 true
子线程: 我还活着 4
主线程: 子线程状态为 true
主线程: 子线程状态为 true
主线程: 子线程状态为 true
子线程: 我还活着 5
主线程: 子线程状态为 true
主线程: 子线程状态为 true
主线程: 子线程状态为 true
- Exception in thread "Thread-0" java.lang.RuntimeException: i am die
- at RunTask.run(RunTask.java:15)
- at java.lang.Thread.run(Thread.java:662)
主线程: 子线程状态为 false
主线程: 子线程状态为 false
主线程: 子线程状态为 false
可以看到, 抛出异常后, 子线程直接终止, 变成了 Flase 状态;
总结
线程正常结束后或者线程抛出了未捕获的异常, 线程变成死亡状态, 使用 isAlive()函数返回 False 好了
来源: http://www.phperz.com/article/18/0213/358892.html