`
zhangwei_david
  • 浏览: 476095 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

Thread 之 Join

 
阅读更多

  

     一个线程可以在其他线程上调用join()方法,其效果是等待一段时间直到第二个线程结束才能继续执行。

JRE的注释中写道:Waits for this thread to die。

     Join仅仅是等待当前线程执行结束,在等待过程中会释放锁资源。

 

 /**
     * Waits for this thread to die.
     *
     * <p> An invocation of this method behaves in exactly the same
     * way as the invocation
     *
     * <blockquote>
     * {@linkplain #join(long) join}{@code (0)}
     * </blockquote>
     *
     * @throws  InterruptedException
     *          if any thread has interrupted the current thread. The
     *          <i>interrupted status</i> of the current thread is
     *          cleared when this exception is thrown.
     */
    public final void join() throws InterruptedException {
        join(0);
    }

 示例代码:

 

/**
 *
 * @author zhangwei_david
 * @version $Id: One.java, v 0.1 2015年5月18日 上午10:40:37 zhangwei_david Exp $
 */
public class One extends Thread {

    /**
     * @see java.lang.Thread#run()
     */
    @Override
    public void run() {
        System.out.println(super.getName() + "  is running....");
        System.out.println(super.getName() + "  end.");
    }

    public One(String name) {
        super(name);
    }

}

 

/**
 *
 * @author zhangwei_david
 * @version $Id: Two.java, v 0.1 2015年5月18日 上午10:41:41 zhangwei_david Exp $
 */
public class Two extends Thread {

    private Thread one;

    /**
     * @see java.lang.Thread#run()
     */
    @Override
    public void run() {
        System.out.println(" two is running....");
        one.start();
        try {
            one.join();
        } catch (InterruptedException e) {

        }
        System.out.println(" two  end");
    }

    public Two(Thread one) {
        super();
        this.one = one;
    }
}

 

/**
 *
 * @author zhangwei_david
 * @version $Id: JoinDemo.java, v 0.1 2015年5月17日 下午3:32:45 zhangwei_david Exp $
 */
public class JoinDemo {

    /**
     *
     * @param args
     * @throws InterruptedException
     */
    public static void main(String[] args) throws InterruptedException {
        Thread one = new One("One");
        Thread two = new Two(one);
        two.start();
    }

}

 从结果中可以发现在线程Two 被挂起,直到线程One执行完成后才继续执行。

 two is running....
One  is running....
One  end.
 two  end

 

  那么join 是如何实现的呢?我们可以看看源码。

public final synchronized void join(long millis)
    throws InterruptedException {
		// 获取当前时间
        long base = System.currentTimeMillis();
        long now = 0;
		// 超时时间小于0
        if (millis < 0) {
            throw new IllegalArgumentException("timeout value is negative");
        }
		// 超时时间等于0
        if (millis == 0) {
			//判断当前线程是否是启动的,如果是启动的一直等待到线程的执行结束也就是没有超时时间
            while (isAlive()) {
				// 如果是启动的则等待0毫秒
                wait(0);
            }
		// 如果超时时间大于0
        } else {
			// 当前线程是启动状态,则一直等待到线程执行结束或者超时
            while (isAlive()) {
				// 获取延迟时间
                long delay = millis - now;
				// 延迟时间小于或等于0 则不需要等待
                if (delay <= 0) {
                    break;
                }
				// 等待 delay 毫秒
                wait(delay);
				// 设置now 值
                now = System.currentTimeMillis() - base;
            }
        }
    }

 

    /**
	  *一直等待到其他线程notify(),notifyAll()或者是超时
	  *
	  **/
	 public final native void wait(long timeout) throws InterruptedException;

 

 

1
1
分享到:
评论

相关推荐

    关于C#中Thread.Join()的一点理解

    是第一次在C#中接触Thread,自己研究了一下其中Thread.Join()这个方法,下面谈谈自己的理解。  Thread.Join()在MSDN中的解释很模糊:Blocks the calling thread until a thread terminates  有两个主要问题: ...

    CountDownLatch与thread.join()的区别

    CountDownLatch与thread.join()的区别

    C#多线程之Thread中Thread.Join()函数用法分析

    本文实例讲述了C#多线程之Thread中Thread.Join()函数用法。分享给大家供大家参考。具体分析如下: Thread.Join()在MSDN中的解释:Blocks the calling thread until a thread terminates 当NewThread调用Join方法的...

    线程创建,线程等待与清除,thread_clean.c,thread_create.c,thread_create.c,thread_exit_struct.c,thread_id.c,thread_int.c, thread_join.c, thread_join.c, thread_string.c, thread_struct.c

    线程等待通常指的是一个线程(父线程)等待另一个线程(子线程)完成其工作,这通常通过`pthread_join()`函数实现,如`thread_join.c`所示。`pthread_join()`让调用线程阻塞,直到指定的线程结束。线程清除,或线程...

    c++11中关于std::thread的join的详解

    C++11中关于std::thread的join详解 C++11引入了std::thread库,提供了对多线程编程的支持。std::thread库提供了两个基本操作:join和detach。join操作用于回收线程资源,避免资源泄露;detach操作用于将线程与创建...

    java 中Thread.join()的使用方法

    在Java编程语言中,`Thread.join()`方法是一个非常重要的同步工具,它允许一个线程(调用者)等待另一个线程(被调用者)执行完成。`Thread.join()`的使用能够有效地解决多线程环境中的顺序执行问题,确保线程间的...

    Java中Thread.join()的使用方法

    Java 中 Thread.join() 的使用方法 Thread.join() 是 Java 中的一个重要方法,该方法允许一个线程等待另一个线程的执行完成。下面我们将详细介绍 Thread.join() 的使用方法、源码分析和示例代码。 1. join() 的...

    JAVA CountDownLatch与thread-join()的区别解析

    JAVA CountDownLatch与thread-join()的区别解析 JAVA 中的线程同步机制是非常重要的,CountDownLatch 和 thread-join() 是两种常用的线程同步方法,本文将详细介绍它们之间的区别。 首先, thread-join() 方法是...

    Java线程之join_动力节点Java学院整理

    `join()`方法定义在`java.lang.Thread`类中,它使得多线程间的协作更加有序。 首先,我们来看`join()`的基本用法。在`Father`类(主线程类)中,创建了一个`Son`类(子线程类)的实例`s`,并调用`s.start()`启动子...

    java 携子之手 与子偕老(join)

    值得注意的是,join()方法可以指定等待的时间,即`thread.join(long millis)`,如果被join的线程在这段时间内没有结束,那么调用join()的线程将不再等待并继续执行。此外,join()还可以接受一个纳秒级别的参数,如`...

    Java之Thread的join方法实例

    在Java多线程编程中,`Thread.join()`方法是一个非常重要的同步工具,它允许一个线程等待另一个线程结束执行后再继续执行。这个方法在处理并发控制和线程协作时非常有用,确保线程间的执行顺序。下面我们将深入探讨`...

    详解C++ thread用法总结

    1,简介 C++11中加入了&lt;thread&gt;头文件,此头文件主要声明了std::thread线程类。C++11的标准类std::thread对线程进行了封装,定义了C++11标准中的一些表示线程的...缺省构造的thread对象、已经完成join的thread对象、已

    C#多线程之Thread中Thread.IsAlive属性用法分析

    - **等待(Wait)**:线程因调用了`Sleep()`, `Join()`, `Monitor.Wait()`, 或其他阻塞方法而暂停执行。 - **挂起(Suspended)**:线程被挂起,无法执行,但内存占用仍然存在。 - **终止(Stopped/Terminated)*...

    java基本教程之join方法详解 java多线程教程

    `join()`方法定义在`java.lang.Thread`类中,其主要功能是使调用该方法的线程(这里称为调用线程)暂停执行,直到目标线程(即`join()`方法所在的线程)执行完毕。这样,可以确保调用线程在目标线程执行完成后才...

    tcl thread 在linux 下的安装包

    thread::join $threadId puts "Main thread finished." ``` 这段代码会创建一个新的线程,并在其中打印一条消息,然后主线程等待新线程结束,最后主线程输出一条消息。需要注意的是,线程间的通信和同步可能需要...

    浅谈Java线程Thread.join方法解析

    Java线程Thread.join方法解析 Java线程中的join方法是一个非常重要的概念,它允许一个线程等待另一个线程的结束,以便进行后续的操作。在本篇文章中,我们将详细介绍Java线程Thread.join方法的解析和实现。 首先,...

    Boost_thread库例程

    my_thread.join(); // 等待my_thread执行完毕 my_thread.detach(); // my_thread将继续运行,主线程不再等待 ``` 在提供的压缩包文件"Boost_thread库示例"中,可能包含了以上各种用法的实例代码,你可以通过阅读...

    Thread.jone

    《线程之道——深入解析Java中的Thread.join()》 在Java编程中,多线程是不可或缺的一部分,它能让我们在程序执行过程中同时处理多个任务,提高效率。而`Thread.join()`方法则是Java线程间协作的重要工具,它允许一...

Global site tag (gtag.js) - Google Analytics