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
    */
     
     
     
     
    做事不能急,给自己一个大方向后总得一步一步来
                      
     
     
     
     
     
     
     
     
     
     
     
     
     
     
  • 相关阅读:
    [模板]RMQ(冲刺准备中)
    洛谷 P2569[SCOI2010]股票交易(动规+单调队列)
    洛谷 P3659 [USACO17FEB]Why Did the Cow Cross the Road I G
    粗略了解fill与fill_n
    计蒜客D2T2 蒜头君的排序(动态维护树状数组)
    洛谷 P3478 [POI2008]STA-Station
    洛谷 P2899 [USACO08JAN]手机网络Cell Phone Network
    洛谷 P3112 [USACO14DEC]后卫马克Guard Mark
    洛谷 P3092 [USACO13NOV]没有找零No Change
    洛谷 P2850 [USACO06DEC]虫洞Wormholes 判负环
  • 原文地址:https://www.cnblogs.com/nedhome/p/6985626.html
Copyright © 2011-2022 走看看