join方法

测试案例

------------------------------------------------------------测试类------------------------------------------------------------

 1 package com.qf.test;
 2 
 3 /**
 4  * @author qf
 5  * @create 2018-09-20 15:32
 6  */
 7 public class Run {
 8     static int count = 0;
 9     public static void main(String[] args) {
10         Thread thread = new Thread(new Runnable() {
11             @Override
12             public void run() {
13                 for (int i = 0; i < 10; i++) {
14                     count++;
15                 }
16             }
17         });
18         thread.start();
19         System.out.println("count = " + count);
20     }
21 }

-----------------------------------------------------------打印结果-----------------------------------------------------------

count = 0

结果是0,并没有被修改成10,说明main线程在thread线程之前执行完成了

如何获取修改后的count值?使用join方法

------------------------------------------------------------测试类------------------------------------------------------------

 1 package com.qf.test;
 2 
 3 /**
 4  * @author qf
 5  * @create 2018-09-20 15:32
 6  */
 7 public class Run {
 8     static int count = 0;
 9     public static void main(String[] args) throws InterruptedException {
10         Thread thread = new Thread(new Runnable() {
11             @Override
12             public void run() {
13                 for (int i = 0; i < 10; i++) {
14                     count++;
15                 }
16             }
17         });
18         thread.start();
19         thread.join();
20         System.out.println("count = " + count);
21     }
22 }

-----------------------------------------------------------打印结果-----------------------------------------------------------

count = 10

原因分析

join源码

    
    public final void join() throws InterruptedException {
        join(0);
    }
==============================================================================
    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()) {// thread对象调用的isAlive方法,所以只要thread还存活,就会循环
                long delay = millis - now;
                if (delay <= 0) {
                    break;
                }
                wait(delay);// wait方法,使当前线程等待,当前线程是main线程
                now = System.currentTimeMillis() - base;
            }
        }
    }

join方法使得当前线程进入阻塞状态,进入排队队列的作用,且必须等待调用join的线程对象执行完run方法才能执行

 

posted @ 2018-09-20 17:26  *青锋*  阅读(138)  评论(0编辑  收藏  举报