join()方法

join()方法是多线程编程中常用的方法,那么它的适用场合到底是怎样的呢?首先看一下官方解释。

    很多情况下,主线程创建并启动子线程,如果子线程中要进行大量耗时运算,主线程往往将早于子线程结束之前结束。这时,如果主线程想等待子线程执行完成后在结束,比如子线程处理的数据,主线程要取得在这个数据中的值,就要使用join()方法了,方法join()的作用是等待县城对象销毁。

    官方解释也比较容易了理解,说白了就是指定线程的执行顺序,说到这儿,我们发现join()所做的事儿sleep()也可以做。确实,但我们可以考虑下面这种情况,直接看代码:

package test;

public class MyThread extends Thread{

	public void run(){
		try{
			int secondValue = (int)(Math.random()*1000);
			System.out.println(secondValue);
			Thread.sleep(secondValue);
		}catch(InterruptedException e){
			e.printStackTrace();
		}
	}
}</span>

package test;

public class Test {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		// TODO Auto-generated method stub
       MyThread threadTest = new MyThread();
       threadTest.start();
       //<span style="color:#ff0000;">Thread.sleep(???)</span>
       System.out.println("我想当threadTest对象执行完毕后我在执行");
       System.out.println("答案不确定");
	}

}

输出结果;

我想当threadTest对象执行完毕后我在执行
答案不确定
677

我们无法确定上面红色字体的sleep()中应该填什么,数小了不起作用,数大了又浪费,这个时候join()方法的优势就凸显出来了。再看下面的代码:

package test;

public class Test {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		// TODO Auto-generated method stub
       MyThread threadTest = new MyThread();
       threadTest.start();
       //Thread.sleep(???)
       try {
		threadTest.join();
	} catch (InterruptedException e) {
		// TODO Auto-generated catch block
		e.printStackTrace();
	}
       System.out.println("我想当threadTest对象执行完毕后我在执行");
	}

}


输出结果:

521
我想当threadTest对象执行完毕后我在执行

上面的例子可以看出,join()方法确实可以实现让线程按顺序执行的效果。那么join()到底是如何实现的呢???

源码之下,无所遁形:

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(lang)方法的源码,原来join()方法内部使用的是wait()方法实现,也从这里,我们就可以看出join()方法与sleep()方法的区别了,他们的区别就是wait()与sleep()的区别!!!!!!!


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值