zoukankan      html  css  js  c++  java
  • 加入一个线程:join

      在启动一个线程之后调用该线程的join()方法,会使该线程先执行,该线程执行完成后,再执行调用该线程的线程。

      例如如下的任务:

    public class LiftOff extends Thread {
    
        public LiftOff(){
            taskCount++;// 计数自增
        }
    
        private int        countDown = 3;        // 倒计时数字
    
        private static int taskCount = 0;
    
        private int        id        = taskCount;
    
        @Override
        public void run() {
            while (countDown >= 0) {
                System.out.println("线程编号" + id + "--倒计时" + countDown);
                countDown--;
                if (countDown < 0) {
                    System.out.println(Thread.currentThread() + ":" + id);
                }
            }
        }
    }

      驱动该任务:

    public class Launch {
    
        public static void main(String[] args) {
            Thread t0 = new Thread(new LiftOff());
            Thread t1 = new Thread(new LiftOff());
            Thread t2 = new Thread(new LiftOff());
            t0.start();
            t1.start();
            try {
                t1.join();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            t2.start();
        }
    }

      程序中利用三个Thread驱动任务,其中t1调用join()方法,输出:

    线程编号0--倒计时3
    线程编号1--倒计时3
    线程编号1--倒计时2
    线程编号1--倒计时1
    线程编号1--倒计时0
    线程编号0--倒计时2
    Thread[Thread-3,5,main]:1
    线程编号0--倒计时1
    线程编号0--倒计时0
    Thread[Thread-1,5,main]:0
    线程编号2--倒计时3
    线程编号2--倒计时2
    线程编号2--倒计时1
    线程编号2--倒计时0
    Thread[Thread-5,5,main]:2

      “线程编号2”的输出总是在t1完全执行完后,也可以在join()中加上超时参数,如果目标线程在该时间到期时还没有结束的话,join()方法也能返回: 

    public class Launch {
    
        public static void main(String[] args) {
            Thread t0 = new Thread(new LiftOff());
            Thread t1 = new Thread(new LiftOff());
            Thread t2 = new Thread(new LiftOff());
            t0.start();
            t1.start();
            try {
                t1.join(1);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            t2.start();
        }
    }

      输出:

    线程编号0--倒计时3
    线程编号1--倒计时3
    线程编号1--倒计时2
    线程编号1--倒计时1
    线程编号1--倒计时0
    Thread[Thread-3,5,main]:1
    线程编号2--倒计时3
    线程编号2--倒计时2
    线程编号2--倒计时1
    线程编号2--倒计时0
    Thread[Thread-5,5,main]:2
    线程编号0--倒计时2
    线程编号0--倒计时1
    线程编号0--倒计时0
    Thread[Thread-1,5,main]:0

      

  • 相关阅读:
    Java volatile 关键字底层实现原理解析
    volatile关键字?MESI协议?指令重排?内存屏障?这都是啥玩意
    聊聊缓存一致性协议
    JIT原理
    java 泛型详解
    Java中的逆变与协变
    疯狂的String
    java中synchronized与Lock的异同
    不使用的大对象为什么要手动设置null,真的有效吗?
    不使用反射如何调用某个实例对象的方法
  • 原文地址:https://www.cnblogs.com/qilong853/p/5911575.html
Copyright © 2011-2022 走看看