Java线程Join方法介绍

一、作用

Thread类中的join方法的主要作用就是同步,它可以使得线程之间的并行执行变为串行执行。

public class Test1 {
	public static void main(String[] args) throws Exception {
		TestThreadJoin t1 = new TestThreadJoin("李明");
		TestThreadJoin t2 = new TestThreadJoin("李亮");
		t1.start();
		t1.join();
		t2.start();
	}	
}

class TestThreadJoin extends Thread{
	public TestThreadJoin(){
		
	}
	public TestThreadJoin(String name){
		super(name);
	}
	public void run(){
		for(int i=0;i<100;i++){
			System.out.println(this.getName()+":"+i);
		}
	}
}

输出结果是:先打印完李明,后打印李亮。

大概说明了join方法的作用:在A线程中调用了B线程的join()方法时,表示只有当B线程执行完毕时,A线程才能继续执行。

这里调用的join方法是没有传参的,join方法其实也可以传递一个参数给它的。

public class Test1 {
	public static void main(String[] args) throws Exception {
		TestThreadJoin t1 = new TestThreadJoin("李明");
		TestThreadJoin t2 = new TestThreadJoin("李亮");
		t1.start();
		t1.join(10);
		t2.start();
	}
}

class TestThreadJoin extends Thread{
	public TestThreadJoin(){
		
	}
	public TestThreadJoin(String name){
		super(name);
	}
	public void run(){
		for(int i=0;i<100;i++){
			System.out.println(this.getName()+":"+i);
		}
	}
}

输出结果是:程序执行前面10毫秒内打印的都是李明线程,10毫秒后,李明和李亮程序交替打印。

join方法中如果传入参数,则表示这样的意思:如果A线程中掉用B线程的join(10),则表示A线程会等待B线程执行10毫秒,10毫秒过后,A、B线程并行执行。需要注意的是,jdk规定,join(0)的意思不是A线程等待B线程0秒,而是A线程等待B线程无限时间,直到B线程执行完毕,即join(0)等价于join()。

二、join与start调用顺序问题

join方法必须在线程start方法调用之后调用才有意义。这个也很容易理解:如果一个线程都没有start,那它也就无法同步了。

三、join方法实现原理

      有了上面的例子,我们大概知道join方法的作用了,那么,join方法实现的原理是什么呢?

  其实,join方法是通过调用线程的wait方法来达到同步的目的的。例如,A线程中调用了B线程的join方法,则相当于A线程调用了B线程的wait方法,在调用了B线程的wait方法后,A线程就会进入阻塞状态,具体看下面的源码:

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方法的原理就是调用相应线程的wait方法进行等待操作的,例如A线程中调用了B线程的join方法,则相当于在A线程中调用了B线程的wait方法,当B线程执行完(或者到达等待时间),B线程会自动调用自身的notifyAll方法唤醒A线程,从而达到同步的目的。

讲解完毕,谢谢!

猜你喜欢

转载自blog.csdn.net/qq_35070001/article/details/79530359