1、join简介:
今天刚学的,这里我简单总结一下,join本身就是“加入”的意思,那么在线程中是什么意思呢?是在一个线程的run方法执行过程中,当特殊情况下需要执行一些其他的操作的时候,我们会用到join这个方法。
假设:
在执行A线程的时候,在A的run方法中,创建 了一个新的线程B,并且启动了,那么接下来分为2种情况:
(1):B没有调用join方法:
这个时候A线程和B线程其实是处于同一个级别状态的,A、B线程可以说是竞争关系,共同争夺CPU的使用权限。
不存在那个一定在前执行,那个一定在后执行的概念!
(2):B调用了join方法:
这个时候,情况就和(1)不一样了!
此时:在A的run方法中,代码块执行到B创建并执行的时候,A线程就会暂时地停止,让出CPU的使用权限,这个时候
B线程就开始执行操作了,当B线程控制的操作执行结束之后,A线程从被停止的操作处,继续开始执行接下来的任务!
2、简单举例说明:
1 package cn.sxt.joins; 2 /** 3 * 加入线程:join 4 * 5 * 模拟:妈妈做饭是让儿子去买酱油 6 * @author 小风微灵 7 * 8 */ 9 10 11 class M extends Thread{12 13 public void run() {14 System.err.println("中午啦!到饭点喽!");15 System.out.println("妈妈准备--做饭。");16 System.out.println("妈妈准备--洗菜。");17 System.out.println("妈妈准备--切菜。");18 System.out.println("妈妈准备--炒菜,发现没有酱油,让儿子去买酱油!");19 20 S s=new S(); 21 s.start();22 try {23 /**分析说明:24 * 必须在启动子辅助线程的之后再调用join方法才会起到效果!25 * 26 * join()效果:27 * 当前线程执行过程中,临时加入一个辅助线程,那么此时,当前线程暂停,28 * 待辅助线程执行结束之后,在继续执行当前线程!29 */30 s.join(); //儿子买酱油加入到妈妈做菜的线程中去31 } catch (InterruptedException e) {32 e.printStackTrace();33 } 34 35 System.out.println("妈妈开始炒菜。");36 System.out.println("饭做好了,一家人一起吃饭。");37 38 }39 }40 41 class S extends Thread{42 public void run() {43 System.out.println("儿子出门下楼。");44 45 try {46 Thread.sleep(1000);47 } catch (InterruptedException e) {48 e.printStackTrace();49 }50 51 System.out.println("儿子到达超,买到酱油!。");52 System.out.println("儿子回家上楼。");53 54 try {55 Thread.sleep(1000);56 } catch (InterruptedException e) {57 e.printStackTrace();58 }59 60 System.out.println("儿子把酱油交给妈妈。");61 }62 }63 64 public class JoinThread {65 66 /**67 * 启动程序68 * @param args69 */70 public static void main(String[] args) {71 72 new M().start();73 }74 75 }
运行结果:
中午啦!到饭点喽!
妈妈准备--做饭。妈妈准备--洗菜。妈妈准备--切菜。妈妈准备--炒菜,发现没有酱油,让儿子去买酱油!儿子出门下楼。儿子到达超,买到酱油!。儿子回家上楼。