java 多线程之join()方法

join()方法作用:阻塞线程,即等同于主线程进入子线程的wait()方法,等待子线程执行完,唤醒主线程才能继续执行,子线程join到主线程。(join()只阻塞主线程,若线程中有其他线程,仍然是并行状态)
如:main是主线程,在main中创建了thread线程,在main中调用了thread.join(),那么等thread结束后再执行main代码。(如情况二和情况三展示)

注意: 虽然join只阻塞主线程,其他线程处于并行状态,但前提是在主线程被阻塞之前已经开启其他线程,否则主线程被阻塞,其他线程未被开启,当然不存在并行的情况。

使用场景:在很多情况下,主线程中生成并启动子线程,若子线程里要进行大量的耗时的运算,主线程往往将于子线程之前执行结束,但是如果主线程处理完其他的程序后,需要用到子线程的处理结果,所以主线程需要等待子线程执行完成之后再结束,这个时候就用到join()方法。

join()方法带参: 带参数的join()方法,即表示被阻塞线程等待子线程xx ms,join(0)等价于join()即被阻塞线程无限等待子线程。
如threadJoin.join(10),则主线程等待子线程10ms,就继续执行

/**
 * @Description: 线程join方法测试
 * @Author: Administrator
 * @Date: 2018/10/17
 **/

public class TestJoin {
    public static void main(String[] args) throws InterruptedException {
        ThreadJoin1 threadJoin1 = new ThreadJoin1("stroy");
        ThreadJoin1 threadJoin2 = new ThreadJoin1("plot");

        //情况一:不使用join()方法
        // 结果:threadJoin1 threadJoin2随即执行,  main方法先执行完
//        threadJoin1.start();
//        threadJoin2.start();
//        System.out.println("TestJoin main:------------------");

        //情况二:threadJoin1使用join()方法
//        threadJoin1.start();
//        threadJoin1.join();
//        threadJoin2.start();
//        System.out.println("TestJoin main:------------------");

        //情况三:threadJoin1   threadJoin2都使用join()方法
        threadJoin1.start();
        threadJoin1.join();
        threadJoin2.start();
        threadJoin2.join();
        System.out.println("TestJoin main:------------------");
    }
}
/**
 * @Description:
 * @Author: Administrator
 * @Date: 2018/10/17
 **/

public class ThreadJoin1 extends Thread{
    private String name;
    public ThreadJoin1(String name){
        this.name = name;
    }

    public void run(){
    	//数值太小,结果不明显,建议大于15
        for(int i = 1; i <= 5; i++){
            System.out.println("ThreadJoin1 run name:" + name + i);
        }
    }
}

情况一执行结果

TestJoin main:------------------
ThreadJoin1 run name:plot1
ThreadJoin1 run name:stroy1
ThreadJoin1 run name:stroy2
ThreadJoin1 run name:stroy3
ThreadJoin1 run name:stroy4
ThreadJoin1 run name:stroy5
ThreadJoin1 run name:plot2
ThreadJoin1 run name:plot3
ThreadJoin1 run name:plot4
ThreadJoin1 run name:plot5

情况二执行结果

ThreadJoin1 run name:stroy1
ThreadJoin1 run name:stroy2
ThreadJoin1 run name:stroy3
ThreadJoin1 run name:stroy4
ThreadJoin1 run name:stroy5
TestJoin main:------------------
ThreadJoin1 run name:plot1
ThreadJoin1 run name:plot2
ThreadJoin1 run name:plot3
ThreadJoin1 run name:plot4
ThreadJoin1 run name:plot5

情况三执行结果

ThreadJoin1 run name:stroy1
ThreadJoin1 run name:stroy2
ThreadJoin1 run name:stroy3
ThreadJoin1 run name:stroy4
ThreadJoin1 run name:stroy5
ThreadJoin1 run name:plot1
ThreadJoin1 run name:plot2
ThreadJoin1 run name:plot3
ThreadJoin1 run name:plot4
ThreadJoin1 run name:plot5
TestJoin main:------------------

你可能感兴趣的:(Java高级)