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()的区别!!!!!!!