一、join()方法,官方描述 waits for this thread to die 等待当前线程死亡;
 
源码:
//无参,默认调用join(0)
public final void join() throws InterruptedException {
join(0);
}
 
//传入两时间millis 毫秒+nanos纳秒,表示等等millis+nanos,最终还是调用了方法3
public final synchronized void join(long millis, int nanos)
throws InterruptedException {
 
if (millis < 0) {
throw new IllegalArgumentException("timeout value is negative");
}
 
if (nanos < 0 || nanos > 999999) {
throw new IllegalArgumentException(
"nanosecond timeout value out of range");
}
 
if (nanos >= 500000 || (nanos != 0 && millis == 0)) {
millis++;
}
 
join(millis);
}
 
//方法3:传入等时间,单位为毫秒,底层调用Object的wait(time)
public final synchronized void join(long millis)
throws InterruptedException {
long base = System.currentTimeMillis();
long now = 0;
 
if (millis < 0) {
throw new IllegalArgumentException("timeout value is negative");
}
 
if (millis == 0) {
while (isAlive()) {
wait(0);//表示一直等待,指导线程死亡
}
} else {
while (isAlive()) {
long delay = millis - now;
if (delay <= 0) {
break;
}
wait(delay);
now = System.currentTimeMillis() - base;
}
}
}
 
 
二、应用,比如几个线程要按一定顺序执行
 
public class ThreadJoin extends Thread {
 
 
public void run(){
try {
this.sleep(500);
System.out.println("["+new Date()+"]"+this.getName());
 
} catch (InterruptedException e) {
e.printStackTrace();
}
}
 
 
public static void main(String[] args) throws Exception {
int length = 5;
Thread[] threads = new Thread[length];
for(int i=0; i<length;i++){
threads[i] = new ThreadJoin();
threads[i].start();
threads[i].join();//每个线程开启后都调用join
}
long endTime=System.currentTimeMillis();
}
}
/*
output:
[Sun Jun 11 13:40:42 CST 2017]Thread-0
[Sun Jun 11 13:40:43 CST 2017]Thread-1
[Sun Jun 11 13:40:43 CST 2017]Thread-2
[Sun Jun 11 13:40:44 CST 2017]Thread-3
[Sun Jun 11 13:40:44 CST 2017]Thread-4
 
 
 
如果把join()注释
结果可能每次都不一样
[Sun Jun 11 13:51:09 CST 2017]Thread-2
[Sun Jun 11 13:51:09 CST 2017]Thread-4
[Sun Jun 11 13:51:09 CST 2017]Thread-1
[Sun Jun 11 13:51:09 CST 2017]Thread-3
[Sun Jun 11 13:51:09 CST 2017]Thread-0
*/
 
 
 
 
做事不能急,给自己一个大方向后总得一步一步来
                  
 
 
 
 
 
 
 
 
 
 
 
 
 
 

线程-join();的更多相关文章

  1. 线程join理解

    1.python默认参数创建线程后,不管主线程是否执行完毕,都会等待子线程执行完毕才一起退出,有无join结果一样 2.如果创建线程,并且设置了daemon为true,即thread.setDaemo ...

  2. Thread线程join方法自我理解

    Thread线程join方法自我理解 thread.join():等待thread线程运行终止,指的是main-thread(main线程)必须等待thread线程运行结束,才能继续thread.jo ...

  3. 【转】线程join()方法的含义

    在很多情况下,主线程生成并启动了子线程,如果子线程里要进行大量的耗时运算,主线程往往将于子线程之前结束,但是如果主线程处理完其它事务后,需要用到子线程的处理结果,也就是主线程需要等待子线程执行完成之后 ...

  4. python网络编程--线程join和Daemon(守护进程)

    一:什么情况下使用join join([timeout])调用join函数会使得主调线程阻塞,直到被调用线程运行结束或超时. 参数timeout是一个数值类型,用来表示超时时间,如果未提供该参数,那么 ...

  5. python线程join

    几个事实 1 python 默认参数创建线程后,不管主线程是否执行完毕,都会等待子线程执行完毕才一起退出,有无join结果一样 2 如果创建线程,并且设置了daemon为true,即thread.se ...

  6. java线程join方法使用方法简介

    本博客简介介绍一下java线程的join方法,join方法是实现线程同步,可以将原本并行执行的多线程方法变成串行执行的 如图所示代码,是并行执行的 public class ThreadTest { ...

  7. Python并发编程04 /多线程、生产消费者模型、线程进程对比、线程的方法、线程join、守护线程、线程互斥锁

    Python并发编程04 /多线程.生产消费者模型.线程进程对比.线程的方法.线程join.守护线程.线程互斥锁 目录 Python并发编程04 /多线程.生产消费者模型.线程进程对比.线程的方法.线 ...

  8. java线程join的意思(转自http://zjj1211.blog_51cto_com)

    Join,单词本事就是连接的意思. 先贴出几段代码猜猜结果. <1> public static int Main() { Alpha oAlpha = new Alpha(); Thre ...

  9. java-多线程-join函数

    join()>>不带参数 线程A调用线程B.join,意思就是线程A并入了线程B,当执行完线程B,再去执行线程A后续动作 join(int keepTims)>>带参数,与上面 ...

  10. 线程join

      class ThreadB extends Thread {     private String ID="0";     private int time=0;     pu ...

随机推荐

  1. POJ 1741/1987 树的点分治

    树的点分治,主要思想是每次找子树的重心,计算经过根节点的情况数,再减去点对属于同一子树的情况. #include <iostream> #include <vector> #i ...

  2. 架构设计之Spring-Session分布式集群会话管理

    前言 通常在web开发中,回话管理是很重要的一部分,用于存储与用户相关的一些数据.对于JAVA开发者来说,项目中的session一般由Tomcat或者jetty容器来管理. 特点介绍 尽管使用特定的容 ...

  3. Python全栈之路-Day33

    1 time模块 #!/usr/bin/env python # __Author__: "wanyongzhen" # Date: 2017/4/7 import time # ...

  4. 将子域名请求路由到MVC区域

    写了个扩展,分享给需要的朋友. 0x01 使用方法 在mvc区域中的{xxxx}AreaRegistration.cs文件中,如ProjectsAreaRegistration.cs <pre& ...

  5. 系统启动 之 Linux系统启动概述(2)

    博客:http://blog.csdn.net/younger_china/article/details/51615916 Linu系统启动是一个"冗长乏味"的过程,那么我们现就 ...

  6. CentOS_5.6下使用cmake编译MySQL_5.5.11教程

    注:资料来自网络    Centos 5.6编译安装mysql 5.5.11 2011年06月24日 星期五 05:33 MySQL 最新的版本5.5.11需要cmake编译安装,估计以后的版本也会采 ...

  7. java.util.NoSuchElementException: None.get的解决方法

    在Java中用null表示无值返回.在Java 里,null 是一个关键字,不是一个对象,所以对它调用任何方法都是非法的 笔者就常在类型转换时见到空指针错误,便是由null的特殊性导致的 而在scal ...

  8. c#无限循环线程如何正确退出

    c#无限循环线程如何正确退出 在主程序将要结束时,迅速正确退出无限循环执行的子线程.一般子线程循环执行会有一个指定的周期, 在子线程等待(或者睡眠)时,无法唤醒退出,尤其在执行周期较长时,子线程无法即 ...

  9. cordova 基本命令 以及如何添加,删除插件

    1.首先下载安装  node.js 在命令提示符 里 输入 node -v  会显示版本号证明安装成功 2.全局安装 cordova: npm install -g cordova 命令提示符里输入 ...

  10. 直接用nose进行django项目测试并输出html报告

    先说需求:1.测试django项目:2.打印测试报告(html格式)有以下几种测试方法:1.django自带的测试模块.在app目录下的tests.py文件中写测试类,类似这样: class MyTe ...