1.4 isAlive()方法

方法isAlive()是判断当前线程是否处于活动状态。

线程代码:

public class TestThread extends Thread{
    @Override
    public void run() {
        System.out.println("run=" + this.isAlive());
    }
}

运行代码:

public class Main {
    public static void main(String[] args) {
        TestThread tt = new TestThread();
        System.out.println("Begin == " + tt.isAlive());
        tt.start();
        //这行代码的结果是不确定的,打印true表示tt线程还未执行完毕,打印false表示tt线程已经执行完毕。下面会给出结果为false的情况
        System.out.println("end == " + tt.isAlive());
    }
}

运行结果:

方法isAlive()是测试线程是否处于活跃状态的方法,

活跃状态:线程已经启动且尚未终止。线程处于正在运行或准备开始运行的状态,就认为线程是“存活的”。

结果为false的执行代码:

public class Main {
    public static void main(String[] args) {
        try {
            TestThread tt = new TestThread();
            System.out.println("Begin == " + tt.isAlive());
            tt.start();
            //通过这行代码使当前线程睡眠,让tt线程完成并结束
            Thread.sleep(1000);
            System.out.println("end == " + tt.isAlive());
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}    

执行结果:

在使用isAlive()方法时,如果将线程对象以构造参数的方式传递给Thread对象进行start()启动时,运行的结果和前面会有差异。产生差异的原因在于:Thread.currentThread()和this的差异。

测试线程代码:

public class countOperate extends Thread {
    public countOperate() {
        System.out.println("countOperate------begin");
        System.out.println("Thread.currentThread().getName() = " + Thread.currentThread().getName());
        System.out.println("Thread.currentThread().isAlive() = " + Thread.currentThread().isAlive());
        System.out.println("this.getName() = " + this.getName());
        System.out.println("this.isAlive() = " + this.isAlive());
        System.out.println("countOperate-------end");
    }

    @Override
    public void run() {
        System.out.println("run-----begin");
        System.out.println("Thread.currentThread().getName() = " + Thread.currentThread().getName());
        System.out.println("Thread.currentThread().isAlive() = " + Thread.currentThread().isAlive());
        System.out.println("this.getName() = " + this.getName());
        System.out.println("this.isAlive()" + this.isAlive());
        System.out.println("run-----end");
    }
}

执行代码:

public class Main {
    public static void main(String[] args) {
        countOperate co = new countOperate();
        Thread t = new Thread(co);
        System.out.println("main begin t isAlive = " + t.isAlive());
        t.setName("A");
        t.start();
        System.out.println("main end t isAlive = " + t.isAlive());
    }
}

执行结果:

最后这个运行结果, 真的是惊了。我觉得run里面的this.isAlive()应该为true的,我认为this指代的就是开启的另一条线程,而main跟a其实都是主线程。后来发现不太对:

修改执行代码:

public class Main {
    public static void main(String[] args) {
        countOperate co = new countOperate();
        Thread t = new Thread(co);
        System.out.println("main begin t isAlive = " + t.isAlive());
        //t.setName("A");
        t.start();
        System.out.println("main end t isAlive = " + t.isAlive());
    }
}

执行结果:

然后我思考了一下:在个人的见解上认为了Thread.currentThread()获取的线程与this的线程的区别。

Thread.currentThread()获取的为当前运行的线程

    注:(在完成CountOperate的构造方法时,运行的是主线程,在调用start()时运行的是t线程。)。

this获取的为当前所在的线程

    注:(所以不论是构造方法中还是run方法中他都位于同一个线程,且这个线程从头到尾都没有被开启)。

源码地址:https://github.com/lilinzhiyu/threadLearning

本文内容是书中内容兼具自己的个人看法所成。可能在个人看法上会有诸多问题(毕竟知识量有限,导致认知也有限),如果读者觉得有问题请大胆提出,我们可以相互交流、相互学习,欢迎你们的到来,心成意足,等待您的评价。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏Java Web

Java学习笔记(3)—— String类详解

前言 因为没有成功地为IDEA配上反编译工具,所以自己下载了一个XJad工具,背景是白色的,所以忍着强迫症硬是把IDEA的主体也给换成白色了,感觉为了这篇文章...

2645
来自专栏Ryan Miao

Java复习2-对象与类

我们设计的class应当尽可能的高内聚,体现为封装的程度。一个class的属性应该只能自己修改,其他class都只是与本class沟通,而不应该有能力修改。比较...

984
来自专栏机器学习从入门到成神

《你不知道的JavaScript》读书笔记(一)

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/sinat_35512245/articl...

441
来自专栏微信公众号:Java团长

Java异常处理和设计

在程序设计中,进行异常处理是非常关键和重要的一部分。一个程序的异常处理框架的好坏直接影响到整个项目的代码质量以及后期维护成本和难度。试想一下,如果一个项目从头到...

993
来自专栏函数式编程语言及工具

Scalaz(5)- typeclass:my typeclass scalaz style-demo

  我们在上一篇讨论中介绍了一些基本的由scalaz提供的typeclass。这些基本typeclass主要的作用是通过操作符来保证类型安全,也就是在前期编译时...

1849
来自专栏C/C++基础

C/C++结构体初始化与赋值

结构体是常用的自定义构造类型,是一种很常见的数据打包方法。结构体对象的初始化有多种方式,分为指定初始化、顺序初始化、构造函数初始化。假如有如下结构体。

792
来自专栏coder修行路

python基础之元组、文件操作、编码、函数、变量

1、集合set 集合是无序的,不重复的,主要作用: 去重,把一个列表变成集合,就可以自动去重 关系测试,测试两组数据的交集,差集,并集等关系 操作例子如下: ...

1669
来自专栏猿天地

java8 Lambda尝尝鲜

转载:猿天地 链接:http://cxytiandi.com/blog/detail/2196 java8都已经发布这么久了,一直没来得及使用,线上环境基本...

33611
来自专栏C/C++基础

申明与定义的区别

C++编码过程中,我们经常谈及“定义”和“声明”,二者是编程过程中的基本概念。我们需要使用一个变量、类型(类、结构体、枚举、共用体)或者函数时,我们需要提前定义...

772
来自专栏java系列博客

有关java中的参数调用的问题

1656

扫码关注云+社区