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 条评论
登录 后参与评论

相关文章

来自专栏张善友的专栏

LINQ via C# 系列文章

LINQ via C# Recently I am giving a series of talk on LINQ. the name “LINQ via C...

3005
来自专栏菩提树下的杨过

Flash/Flex学习笔记(23):运动学原理

先写一个公用的小球类Ball: package{ import flash.display.Sprite; //小球 类 public class B...

27310
来自专栏闻道于事

js登录滑动验证,不滑动无法登陆

js的判断这里是根据滑块的位置进行判断,应该是用一个flag判断 <%@ page language="java" contentType="text/html...

8668
来自专栏跟着阿笨一起玩NET

c#实现打印功能

3702
来自专栏码匠的流水账

聊聊NettyConnector的start及shutdown

reactor-netty-0.7.6.RELEASE-sources.jar!/reactor/ipc/netty/NettyConnector.java

1031
来自专栏我和未来有约会

Kit 3D 更新

Kit3D is a 3D graphics engine written for Microsoft Silverlight. Kit3D was inita...

2936
来自专栏张善友的专栏

Miguel de Icaza 细说 Mix 07大会上的Silverlight和DLR

Mono之父Miguel de Icaza 详细报道微软Mix 07大会上的Silverlight和DLR ,上面还谈到了Mono and Silverligh...

2997
来自专栏落花落雨不落叶

canvas画简单电路图

84611
来自专栏转载gongluck的CSDN博客

cocos2dx 打灰机

#include "GamePlane.h" #include "PlaneSprite.h" #include "BulletNode.h" #include...

7156
来自专栏我和未来有约会

Silverlight第三方控件专题

这里我收集整理了目前网上silverlight第三方控件的专题,若果有所遗漏请告知我一下。 名称 简介 截图 telerik 商 RadC...

4395

扫码关注云+社区