从头认识java-18.2 基本的线程机制(7)join

来源:互联网 发布:网络直播主持词 编辑:程序博客网 时间:2024/05/22 02:28

这一章节我们来讨论一下join。

1.什么是join?

堵塞当前线程,让.join的线程先做完,然后再继续当前线程

下面是api的解释:

A.join,在API中的解释是,堵塞当前线程B,直到A执行完毕并死掉,再执行B。 


2.例子:

package com.ray.ch17;public class Test {public static void main(String[] args) throws InterruptedException {System.out.println(Thread.currentThread().getName() + " start");SleepThread sleepThread = new SleepThread("sleep");Thread.sleep(2000);JoinThread joinThread = new JoinThread(sleepThread, "join");//joinThread.join();System.out.println(Thread.currentThread().getName() + " end");}}class SleepThread extends Thread {public SleepThread(String name) {super(name);start();}@Overridepublic void run() {try {for (int i = 0; i < 5; i++) {System.out.println(getName() + " SleepThread");Thread.sleep(1000);}} catch (InterruptedException e) {e.printStackTrace();}}}class JoinThread extends Thread {private SleepThread sleepThread;public JoinThread(SleepThread sleepThread, String name) {super(name);this.sleepThread = sleepThread;start();}@Overridepublic void run() {try {System.out.println(getName() + " join start");sleepThread.join();System.out.println(getName() + " join end");} catch (InterruptedException e) {e.printStackTrace();}}}

输出:

main start
sleep SleepThread
sleep SleepThread
sleep SleepThread
main end
join join start
sleep SleepThread
sleep SleepThread
join join end


package com.ray.ch17;public class Test {public static void main(String[] args) throws InterruptedException {System.out.println(Thread.currentThread().getName() + " start");SleepThread sleepThread = new SleepThread("sleep");Thread.sleep(2000);JoinThread joinThread = new JoinThread(sleepThread, "join");joinThread.join();System.out.println(Thread.currentThread().getName() + " end");}}class SleepThread extends Thread {public SleepThread(String name) {super(name);start();}@Overridepublic void run() {try {for (int i = 0; i < 5; i++) {System.out.println(getName() + " SleepThread");Thread.sleep(1000);}} catch (InterruptedException e) {e.printStackTrace();}}}class JoinThread extends Thread {private SleepThread sleepThread;public JoinThread(SleepThread sleepThread, String name) {super(name);this.sleepThread = sleepThread;start();}@Overridepublic void run() {try {System.out.println(getName() + " join start");sleepThread.join();System.out.println(getName() + " join end");} catch (InterruptedException e) {e.printStackTrace();}}}

输出:

main start
sleep SleepThread
sleep SleepThread
sleep SleepThread
join join start
sleep SleepThread
sleep SleepThread
join join end
main end


上面两个代码的不同主要是体现在joinThread.join();是否被注释。

对比上面的两个代码的输出,主要不同在于main end 的位置,当joinThread.join();的时候,由于需要先阻塞main方法的线程,先完成joinThread所在线程,因此main end的位置会出现上面的变化。

另一方面,我们从sleep和join两个线程输出的文字的位置也可以推导出上面的结论。


总结:这一章节我们简单介绍了一下join。


这一章节就到这里,谢谢。

-----------------------------------

目录


0 0
原创粉丝点击