美文网首页
join的用法

join的用法

作者: 若尘0328 | 来源:发表于2017-12-06 15:23 被阅读13次

Thread类中提供的join方法可以让线程插队,比如A、B两个线程,在A线程中调用B线程的join方法,那么执行结果一定是A线程在B线程执行结束之后再执行自己下面的逻辑

        Thread B=new Thread(new Runnable() {
            @Override
            public void run() {
                    try {
                        countDownLatch.await();
                        System.out.println("B线程首先执行");
                        Thread.sleep(2000);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                    System.out.println("B线程执行结束");
                }
        });
        Thread A=new Thread(new Runnable() {
            @Override
            public void run() {
                    try {
                        countDownLatch.await();
                        System.out.println("A执行");
                        B.join();
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                    System.out.println("A执行结束");
                }
        });
        B.start();A.start();
        countDownLatch.countDown();
    }

执行结果

B线程首先执行
A执行
B线程执行结束
A执行结束

从执行结果来看,A并没有在B线程完全结束之后再执行,如果想让A在B执行结束之后再执行就要加锁来实现了,下面是加锁代码

        Object lock=new Object();
        Thread B=new Thread(new Runnable() {
            @Override
            public void run() {
                synchronized (lock){
                    try {
                        countDownLatch.await();
                        System.out.println("B线程首先执行");
                        Thread.sleep(2000);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                    System.out.println("B线程执行结束");
                }
            }
        });
        //被插队线程
        Thread A=new Thread(new Runnable() {
            @Override
            public void run() {
                synchronized (lock){
                    try {
                        countDownLatch.await();
                        System.out.println("A执行");
                        //插队线程插队,先于bejoined线程执行完毕
                        B.join();
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                    System.out.println("A执行结束");
                }

            }
        });
        B.start();A.start();
        countDownLatch.countDown();

执行结果

B线程首先执行
B线程执行结束
A执行
A执行结束

相关文章

网友评论

      本文标题:join的用法

      本文链接:https://www.haomeiwen.com/subject/netlixtx.html