线程中的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()