IT博客汇
  • 首页
  • 精华
  • 技术
  • 设计
  • 资讯
  • 扯淡
  • 权利声明
  • 登录 注册

    Java线程死亡的几种情况

    Crazyant发表于 2015-09-11 08:29:14
    love 0

    Java线程会议如下三种方式结束,结束后就处于死亡状态

    1、run()或者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.crazyant.net/1861.html,转载请注明来源

    您可能也喜欢:

    java环境变量配置

    Java怎样单测void类型的方法?

    Java使用javap命令或者eclipse Bytecode visualizer插件查看class字节码

    Java使用lombok自动生成getter和setter方法

    通过JVM堆栈分析出现大量线程的原因
    无觅


沪ICP备19023445号-2号
友情链接