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

Java 线程中的 Join 浅析

2015-03-11 00:00 267 查看
Join是Java线程中的一个方法。网上对其解释有很多,其实作用很简单,就是如果某个线程调用了join方法,则该行代码(thread.join() ) 之后的代码,需要在该线程执行完毕之后才能执行,很简单,首先给出一个没有使用join的例子。代码如下:

public class JoinTester implements Runnable{

@Override
public void run() {
for( int i = 0;i < 5;i ++){
System.out.println(Thread.currentThread().getName());
try {
Thread.currentThread().sleep(200);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}

public static void main(String args[]){
JoinTester join = new JoinTester();

Thread t1 = new Thread(join, "Thread 1");
Thread t2 = new Thread(join, "Thread 2");

t1.start();
t2.start();
System.out.println("主线程结束");
}
}

执行结果如下:

Thread 1
主线程结束
Thread 2
Thread 2
Thread 1
Thread 2
Thread 1
Thread 2
Thread 1
Thread 2
Thread 1

从该结果不难看出,在两个线程启动以后,主程序很快结束工作。而两个线程同时执行,相互的打印出结果。最后两个线程结束。

我们进行如下更改:

t1.start();

try {
t1.join();
} catch (InterruptedException e) {
e.printStackTrace();
}

t2.start();
System.out.println("主线程结束");

执行结果如下:

Thread 1
Thread 1
Thread 1
Thread 1
Thread 1
主线程结束
Thread 2
Thread 2
Thread 2
Thread 2
Thread 2

从结果中不难看出,在线程1启动之后,调用了join方法,主线程等待线程1执行完毕后,启动了线程2,然后主线程自己退出,这个时候线程2依然在工作,线程2工作结束之后,线程2退出。

继续进行更改如下:

t1.start();

try {
t1.join();
} catch (InterruptedException e) {
e.printStackTrace();
}

t2.start();
try {
t2.join();
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("主线程结束");

再次执行程序,得到结果如下:

Thread 1
Thread 1
Thread 1
Thread 1
Thread 1
Thread 2
Thread 2
Thread 2
Thread 2
Thread 2
主线程结束

从结果中可以看出,线程1执行完毕之后,线程2才开始执行,线程2结束之后,主线程才退出。

从这个简单的例子可以看出,Java线程的join机制可以帮助控制线程的顺序执行,比如线程B的依赖于线程A的结果,则可以利用该机制,等线程A得到结果之后,线程B才开始执行。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: