zoukankan      html  css  js  c++  java
  • 多线程--Thread.join方法

    在Thread类的Api中,Join的作用是让当前线程等待目标线程结束之后才继续执行。

    thread.Join把指定的线程加入到当前线程,可以将两个交替执行的线程合并为顺序执行的线程。 
    比如在线程B中调用了线程A的Join()方法,直到线程A执行完毕后,才会继续执行线程B。 
    想要更深入了解,建议看一下join的源码,也很简单的,使用wait方法实现的。

    t.join(); //调用join方法,等待线程t执行完毕 
    t.join(1000); //等待 t 线程,等待时间是1000毫秒。

    分别是

    
    
    public final synchronized void join(long millis, int nanos); //使当前线程等待目标线程millis 毫秒 ,nanos纳秒之后,当前线程继续执行。
    
    
    public final synchronized void join(long millis); //使当前线程等待目标线程millis 毫秒,当前线程继续执行。
    
    
    public final void join(); //使当前线程时刻检测目标线程,直到目标线程执行完成,再执行当前线程。
    
    
    

    下面我们主要查看下 public final synchronized void join(long millis) 的源码:

        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) {
          //如果等待的毫秒数为0,则通过Api, isAlive()时刻检测目标线程是否存活,若存活则继续等待。
    while (isAlive()) { wait(0); } } else { while (isAlive()) {
            //判断目标线程是否存活,若存活,则等待mills毫秒,然后跳出join,当前线程执行。
    long delay = millis - now; if (delay <= 0) { break; } wait(delay); now = System.currentTimeMillis() - base; } } }

    从源码可以看出,就是当前线程在判断目标线程是否存活,如果存活根据参数的值,是无限等待到目标线程结束才执行当前线程,还是执行一段时间就开始执行当前线程。

    public final void join();底层调用Join(0);实现无限等待知道目标线程结束。
     
    下面再编写一个demo,先执行线程1,再执行线程2,最后执行线程3;
    package com.dsx.thread;
    
    public class TestThreadJoin {
        public static void ThreadCreate(){
            final Thread t1 = new Thread(new Runnable() {
                public void run() {
                    System.out.println("线程1执行了。。。");
                    try {
                        Thread.sleep(5000);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
            });
    
            final Thread t2 = new Thread(new Runnable() {
                public void run() {
                    try {
                        t1.join();
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                    System.out.println("线程2执行了。。。。。");
                }
            });
            Thread t3 = new Thread(new Runnable() {
                public void run() {
                    try {
                        t2.join();
                        Thread.sleep(2000);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                    System.out.println("线程3执行了。。。。。。。");
                }
            });
            t3.start();
            t2.start();
            t1.start();
        }
        public static void main(String[] args) {
            ThreadCreate();
        }
    }
    
    
    



  • 相关阅读:
    贾鹏芳 二胡演奏家
    php 关于下载中文文件实现
    Android 线程。。
    Hadoop命令行接口运行自己编写的类
    ubuntu下jdk环境变量的设置
    navicat导入sql语句文件失败原因-----datetime
    sql server获取当前时间到秒级和毫秒级的语句
    sql关于group by的问题
    java的equal和==的区别
    win8.1 占用80端口问题
  • 原文地址:https://www.cnblogs.com/wenq001/p/10238207.html
Copyright © 2011-2022 走看看