一个线程如何知道另一线程已经结束?Thread类提供了回答此问题的方法。

有两种方法可以判定一个线程是否结束。第一,可以在线程中调用isAlive()。这种方法由Thread定义,它的通常形式如下:

final boolean isAlive( )

如果所调用线程仍在运行,isAlive()方法返回true,如果不是则返回false。但isAlive()很少用到,等待线程结束的更常用的方法是调用join(),描述如下:

final void join( ) throws InterruptedException

该方法等待所调用线程结束。该名字来自于要求线程等待直到指定线程参与的概念。join()的附加形式允许给等待指定线程结束定义一个最大时间。下面是前面例子的改进版本。运用join()以确保主线程最后结束。同样,它也演示了isAlive()方法。

// Using join() to wait for threads to finish.

class NewThread implements Runnable {

String name; // name of thread

Thread t;

NewThread(String threadname) {

name = threadname;

t = new Thread(this, name);

System.out.println("New thread: " + t);

t.start(); // Start the thread

}

// This is the entry point for thread.

public void run() {

try {

for(int i = 5; i > 0; i--) {

System.out.println(name + ": " + i);

Thread.sleep(1000);

}

} catch (InterruptedException e) {

System.out.println(name + " interrupted.");

}

System.out.println(name + " exiting.");

}

}

class DemoJoin {

public static void main(String args[]) {

NewThread ob1 = new NewThread("One");

NewThread ob2 = new NewThread("Two");

NewThread ob3 = new NewThread("Three");

System.out.println("Thread One is alive: "+ ob1.t.isAlive());

System.out.println("Thread Two is alive: "+ ob2.t.isAlive());

System.out.println("Thread Three is alive: "+ ob3.t.isAlive());

// wait for threads to finish

try {

System.out.println("Waiting for threads to finish.");

ob1.t.join();

ob2.t.join();

ob3.t.join();

} catch (InterruptedException e) {

System.out.println("Main thread Interrupted");

}

System.out.println("Thread One is alive: "+ ob1.t.isAlive());

System.out.println("Thread Two is alive: "+ ob2.t.isAlive());

System.out.println("Thread Three is alive: "+ ob3.t.isAlive());

System.out.println("Main thread exiting.");

}

}

程序输出如下所示:

New thread: Thread[One,5,main]

New thread: Thread[Two,5,main]

New thread: Thread[Three,5,main]

Thread One is alive: true

Thread Two is alive: true

Thread Three is alive: true

Waiting for threads to finish.

One: 5

Two: 5

Three: 5

One: 4

Two: 4

Three: 4

One: 3

Two: 3

Three: 3

One: 2

Two: 2

Three: 2

One: 1

Two: 1

Three: 1

Two exiting.

Three exiting.

One exiting.

Thread One is alive: false

Thread Two is alive: false

Thread Three is alive: false

Main thread exiting.

如你所见,调用join()后返回,线程终止执行。

java thread isalive_Java线程编程中isAlive()和join()的使用详解相关推荐

  1. 网络编程中的SO_REUSEADDR和SO_REUSEPORT参数详解

    1.SO_REUSEADDR: 在BSD中,SO_REUSEADDR选项有两个用户: 如果有socket绑定了0.0.0.0:port:设置该参数后,其他socket可以绑定本机ip:port.(该功 ...

  2. Java并发编程(07):Fork/Join框架机制详解

    本文源码:GitHub·点这里 || GitEE·点这里 一.Fork/Join框架 Java提供Fork/Join框架用于并行执行任务,核心的思想就是将一个大任务切分成多个小任务,然后汇总每个小任务 ...

  3. [Java入门笔记] 面向对象编程基础(二):方法详解

    2019独角兽企业重金招聘Python工程师标准>>> 什么是方法? 简介 在上一篇的blog中,我们知道了方法是类中的一个组成部分,是类或对象的行为特征的抽象. 无论是从语法和功能 ...

  4. C++ tcpip网络编程中listen函数和accept函数详解和区别

    listen函数 摘要:listen函数使用主动连接套接口变为被连接套接口,使得一个进程可以接受其它进程的请求,从而成为一个服务器进程.在TCP服务器编程中listen函数把进程变为一个服务器,并指定 ...

  5. java 不可修改的map_Java中如何实现不可变Map详解

    前言 有时最好不允许修改  java.util.Map, 例如跨线程共享只读数据.为此,我们可以使用Unmodifiable Map或Immutable Map. 在这个快速教程中,我们将看到它们之间 ...

  6. java 8 不可变map_Java中如何实现不可变Map详解

    前言 有时最好不允许修改  java.util.map, 例如跨线程共享只读数据.为此,我们可以使用unmodifiable map或immutable map. 在这个快速教程中,我们将看到它们之间 ...

  7. java int byte数组_Java 中int与byte数组转换详解

    1.与运算符的理解(&): 参加运算的两个数据,按二进位进行"与"运算.如果两个相应的二进位都为1,则该位的结果值为1,否则为0.即 0&0=0:0&1=0 ...

  8. java构造器调用构造器_java中构造器内部调用构造器实例详解

    可能为一个类写了多个构造器,有时可能想在一个构造器里面调用另外一个构造器,为了减少代码的重复,可用this关键字做到这一点. public class Flower { private String ...

  9. Cocoa编程中视图控制器与视图类详解

    iPhone编程规则是:一个窗口,多个视图.UIView是iPhone屏幕上很多控件的基础类.每个iPhone用户界面都是由显示在UIWindow(这其实也是个特殊的UIView)内的众多UIView ...

最新文章

  1. GPB|农业生产活动对水体微生态的重要影响(一作解读)
  2. 亿科影视管理系统1.2.0版以及1.0版本均有后门
  3. NYOJ 469 擅长排列的小明 II (dp问题)
  4. Hadoop Yarn内存使用优化配置
  5. 【小白学习C++ 教程】五、C++数据结构向量和数组
  6. RavenDB:基于Windows/.NET平台的NoSQL数据库
  7. 【Pytorch神经网络理论篇】 28 DGLGraph图的基本操作(缺一部分 明天补)
  8. 11.73 亿人看央视春晚;苹果逼用户买充电器;特斯拉 Model 3 降价七千 | 极客头条...
  9. std::thread参数传递包含引用时的注意事项
  10. (个人)Linux基本指令收集
  11. 【2016-2017 ACM-ICPC (ECNA 2016) F】Removal Game【区间DP】
  12. c语言海报设计图片,ps海报设计教程:一张照片配文字排版技巧
  13. 网络上的计算机找不到打印机,网络打印机找不到,详细教您网络打印机找不到怎么办...
  14. 计算机的发明人是约翰用英语,电脑发明者是谁:约翰·冯·诺依曼(发明于1946年)...
  15. 条件欧几里得聚类实验数据集Statues_4.pcd下载
  16. 全程回顾 Blazor Day in China 精彩分享
  17. 无损音乐知识收集3(转)
  18. 计算机网络——基本认识
  19. Python编程求:一个球从100m高度自由落下,每次落地后反跳回原高度的一半,再落下,反弹,求在第十次落地时,共经过多少米,第十次反弹多高
  20. pytorch中的Variable还有必要使用吗?

热门文章

  1. 蓝桥杯 n进制小数
  2. cpickle支持的python版本_Python序列化模块pickle和cPickle
  3. 钉钉机器人发送图片 python_python封装钉钉Webhook机器人消息发送逻辑
  4. 小心DLL链接静态库时的内存错误
  5. arduino蜂鸣器_板卡推荐BPIUNO32 arduino 开发板,支持webduino与arduino应用
  6. 第一代计算机主要应用领域为数据处理,第一代计算机主要应用领域为____。    A.数据处理 B.人工智能 C.科学计算 D.过程控制...
  7. C语言switch怎么算,超级新手,用switch写了个计算器程序,求指导
  8. ansi编码转换_8b/1b编码是个什么东东
  9. 【APICloud系列|30】苹果MAC电脑取消辅助功能-语音识别
  10. Metasploit入门用法(主动攻击)