zoukankan      html  css  js  c++  java
  • 线程-join();

    一、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
    */
     
     
     
     
    做事不能急,给自己一个大方向后总得一步一步来
                      
     
     
     
     
     
     
     
     
     
     
     
     
     
     
  • 相关阅读:
    Python的递归深度问题
    Python之多进程
    Python之多线程
    Git的基本操作
    ref与out区别
    Numpy基本操作
    面向对象中有哪些双下线方法及应用场景
    上下文管理
    Local与LocalStack
    基于列表实现栈
  • 原文地址:https://www.cnblogs.com/nedhome/p/6985626.html
Copyright © 2011-2022 走看看