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
本文内容是书中内容兼具自己的个人看法所成。可能在个人看法上会有诸多问题(毕竟知识量有限,导致认知也有限),如果读者觉得有问题请大胆提出,我们可以相互交流、相互学习,欢迎你们的到来,心成意足,等待您的评价。
1.4 isAlive()方法的更多相关文章
- Java 学习笔记之 线程isAlive方法
isAlive方法: 方法isAlive()功能是判断当前线程是否处于活动状态. 活动状态就是线程启动且尚未终止,比如正在运行或准备开始运行. public class IsAliveThread e ...
- Java并发编程基础--基本线程方法详解
什么是线程 线程是操作系统调度的最小单位,一个进程中可以有多个线程,这些线程可以各自的计数器,栈,局部变量,并且能够访问共享的内存变量.多线程的优势是可以提高响应时间和吞吐量. 使用多线程 一个进程正 ...
- Java Thread.join()方法
一.使用方式. join是Thread类的一个方法,启动线程后直接调用,例如: Thread t = new AThread(); t.start(); t.join(); 二.为什么要用join() ...
- java多线程基本概述(二)——Thread的一些方法
在Thread类中有很多方法值得我们关注一下.下面选取几个进行范例: 1.1.isAlive()方法 java api 描述如下: public final boolean isAlive() Tes ...
- java多线程基本概述(七)——join()方法
在很多情况下,主线程创建并启动子线程,如果子线程中有大量的耗时运算,主线程将早于子线程结束,如果想让主线程等待子线程结束后再结束,那么我们可以使用join()方法.调用join()方法的意思是当前线程 ...
- JAVA THREAD.JOIN方法详解
一.使用方式. join是Thread类的一个方法,启动线程后直接调用,例如: Thread t = new AThread(); t.start(); t.join(); 二.为什么要用join() ...
- python多线程几种方法实现
python多线程编程 Python多线程编程中常用方法: 1.join()方法:如果一个线程或者在函数执行的过程中调用另一个线程,并且希望待其完成操作后才能执行,那么在调用线程的时就可以使用被调线程 ...
- Java线程编程中isAlive()和join()的使用详解
一个线程如何知道另一线程已经结束?Thread类提供了回答此问题的方法. 有两种方法可以判定一个线程是否结束.第一,可以在线程中调用isAlive().这种方法由Thread定义,它的通常形式如下: ...
- Java多线程,判断其他线程是否结束的方法
方法1:通过Thread类中的isAlive()方法判断线程是否处于活动状态. 线程启动后,只要没有运行完毕,都会返回true. [注]如果只是要等其他线程运行结束之后再继续操作,可以执行t.join ...
随机推荐
- windowsphone8.1学习笔记之应用数据(四)
应用数据的存储格式常用的分为json和xml两种(其实我都想略过这个地方的,json我一直用的是json.net,而wp上操作xml的方式与其他相比也没太多变化). 先说说json数据存储,关于jso ...
- zabbix server 端安装
1.系统环境 [root@crazy-acong ~]# cat /etc/redhat-release CentOS release 6.6 (Final) [root@crazy-acong ~] ...
- Android系统移植与调试之------->如何修改Android设备添加重启、飞行模式、静音模式等功能(二)
今天要说的是为Android设备添加重启.飞行模式.静音模式按钮,客户需求中需要添加这项功能,在长按电源键弹出的菜单中没有这些选项,谨以此文记录自己添加这个功能的过程. 首先找到长按电源键弹出的对话框 ...
- hash是什么?
最近读关于php内核的资料,发现php中 在实现变量以及数据类型的实现中大量使用哈希算法,并且非常细致做出了很多优秀的细节设计.比如:在 zend.hash.h 中 static inline ulo ...
- JVM性能优化, Part 5 Java的伸缩性
很多程序员在解决JVM性能问题的时候,花开了很多时间去调优应用程序级别的性能瓶颈,当你读完这本系列文章之后你会发现我可能更加系统地看待这类的问题.我说过JVM的自身技术限制了Java企业级应用的伸缩性 ...
- 【HTTP】HTPP学习笔记
1.了解web及网络基础 HTTP的诞生 TCP/IP协议族 应用层 FTP文件传输协议 HTTP超文本传输协议 DNS域名系统:IP地址<--->域名 传输层 TCP传输控制协议 三次握 ...
- jquery 如何获取单选框的值
jquery 如何获取单选框的值 获取单选框的值有三种方式: 1.$('input:radio:checked').val():2.$("input[type='radio']:chec ...
- 在linux系统下Git源码系统的文件下载
Git是一个开源的分布式版本控制系统,在linux系统中下载git中的文件使用repo的很多. 网上有很多repo下载的地址失效,目前可用的链接在这里记录一下. 没有安装git的安装一下: sudo ...
- hd acm 1465
问题:某人写了n封信和n个信封,如果所有的信都装错了信封.求所有的信都装错信封,共有多少种不同情况. 思路:由这道题引入错排公式:f(n)=(n-1)*[f(n-1)+f(n-2)]. 当N=1和2时 ...
- Android进程间通信(IPC)机制Binder简要介绍和学习计划【转】
本文转载自:http://blog.csdn.net/luoshengyang/article/details/6618363 在Android系统中,每一个应用程序都是由一些Activity和Ser ...