线程中的join()

Posted ddiamondd

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了线程中的join()相关的知识,希望对你有一定的参考价值。

http://blog.itpub.net/31555134/viewspace-2221319/

       一直对join()方法不是很理解,在A线程中, B线程调用了join()方法,然后在内部实际是wait()方法,但是在效果上是A线程一直在等待,对wait()方法的调用不是很理解。(希望有朋友能够给我答疑 非常感谢)

      join()方法的作用是使所属的线程对象x正常执行run()方法中的任务,而使当前线程z进行无限期的阻塞,等待线程x销毁后再继续执行线程z后面的代码。方法join具有使线程排队运行的作用,有些类似同步的运行效果。

下面是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);
    
    /**
     * Waits at most @code millis milliseconds for this thread to
     * die. A timeout of @code 0 means to wait forever. // 0意味着永远等待不是等待0秒   millis意味着只等待millis,超过这个时间则停止等待
     *
     * <p> This implementation uses a loop of @code this.wait calls
     * conditioned on @code this.isAlive. As a thread terminates the  //当线程终止时, 会自动调用notifyall()方法
     * @code this.notifyAll method is invoked. It is recommended that
     * applications not use @code wait, @code notify, or
     * @code notifyAll on @code Thread instances.
     *
     * @param  millis
     *         the time to wait in milliseconds
     *
     * @throws  IllegalArgumentException
     *          if the value of @code millis is negative
     *
     * @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 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;
            
        
    

当然了, join()方法放在start()方法后面才会有效果。

以上是关于线程中的join()的主要内容,如果未能解决你的问题,请参考以下文章

C++11多线程中的detach()join()joinable()

006 线程中的join方法

python线程中的join(转)

线程中的join()

彻底理解Python多线程中的setDaemon与join配有GIF示意

python的多线程中的join的作用