多线程的join()方法

来源:互联网 发布:广州网络危机公关公司 编辑:程序博客网 时间:2024/06/04 19:50

线程的合并指的是:将指定的线程加入到当前的线程之中,可以将两个交替执行的线程合并为顺序执行的线程,如果在线程B中调用了线程A的Join()方法,直到线程A执行完毕后,才会继续执行线程B。

public class JoinThread {public static void main(String[] args) {//线程的合并/* * 把指定的线程加入到当前线程,可以将两个交替执行的线程合并为顺序执行的线程。 * 比如在线程B中调用了线程A的Join()方法,直到线程A执行完毕后,才会继续执行线程B。 * 比如在下面的例子中在20之前两个线程交替执行,但是当join()后一直在执行加入的线程, * 直到加入的线程完毕再继续执行其他的线程 */Join j = new Join();j.setName("分线程");j.start();for (int i = 0; i < 50; i++) {if(i == 20){try {j.join();//当主线程执行到20时,强行将Join线程合并,等Join线程执行完毕,再执行剩下的数字} catch (InterruptedException e) {e.printStackTrace();}}System.out.println(Thread.currentThread().getName() + ":" + i);}}}class Join extends Thread{@Overridepublic void run() {for (int i = 0; i < 50; i++) {System.out.println(Thread.currentThread().getName() + ":" + i);}}}

输出的结果:

分线程:0分线程:1分线程:2分线程:3分线程:4分线程:5分线程:6分线程:7分线程:8分线程:9分线程:10分线程:11分线程:12分线程:13分线程:14分线程:15分线程:16main:0分线程:17分线程:18分线程:19分线程:20分线程:21分线程:22分线程:23分线程:24分线程:25分线程:26分线程:27分线程:28分线程:29分线程:30分线程:31分线程:32分线程:33分线程:34分线程:35分线程:36分线程:37分线程:38分线程:39分线程:40分线程:41分线程:42分线程:43分线程:44分线程:45分线程:46分线程:47分线程:48分线程:49main:1main:2main:3main:4main:5main:6main:7main:8main:9main:10main:11main:12main:13main:14main:15main:16main:17main:18main:19main:20main:21main:22main:23main:24main:25main:26main:27main:28main:29main:30main:31main:32main:33main:34main:35main:36main:37main:38main:39main:40main:41main:42main:43main:44main:45main:46main:47main:48main:49
源码中的解释:

<span style="font-size:14px;"> /**     * </span><span style="color:#ff0000;"><strong>Waits at most {@code millis} milliseconds for this thread to     * die. A timeout of {@code 0} means to wait forever.注意看这句话,它说的意思就是加入的线程死亡后才继续执行否则,永远等待</strong></span><span style="font-size:14px;">     *     * <p> This implementation uses a loop of {@code this.wait} calls     * conditioned on {@code this.isAlive}. As a thread terminates the     * {@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;            }        }    }</span>



0 0
原创粉丝点击