您的位置:首页 > 编程语言 > Java开发

JAVA多线程-线程间通信(四)-join的使用

2016-02-21 10:04 537 查看
方法join的使用

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

demo案例

package org.jksoft.thread.join;
/**
* 测试案例一:让主线程在子线程结束之后,再结束。我们利用的是join方法
* @author mcl
*
* 2016-2-20-下午6:08:36
*/
public class Test1 {
public static void main(String[] args) {
Thread thread = new TestThread("子线程");
thread.start();
try {
thread.join();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println("我等到子线程结束了");
}
}
class TestThread extends Thread{
public TestThread(String name){
this.setName(name);
}
public void run(){
long a = (long)(Math.random()*10000);
try {
sleep(a);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName()+":"+a);
}
}
运行结果



结果分析

方法join的作用是使所属的线程对象A正常执行run()方法中的任务,而使当前主线程无期限的阻塞,等待线程A销毁后,再继续执行主线程后面的代码。

方法join具有使线程排队的作用,有些类似同步的运行效果。

join详解:

1、join与synchronized的区别

join在内部使用wait()进行等待,而synchronized关键字使用的是“对象监视器”原理做为同步。

2、join与interrupt彼此遇到的话,则会出现异常

3、join(long):参数为设定等待时间。表示主线程只等待子线程x秒,在X秒之间内,子线程结束,则唤醒主线程;否则,直接唤醒主线程。

4 、join(long)与sleep(long)的区别

由于join(long)的内部使用的是wait(long),所以它具有释放锁的特点,而sleep(long)不会释放锁。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: