Java线程(学习整理)--2---加入另一个线程join
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 args 69 */ 70 public static void main(String[] args) { 71 72 new M().start(); 73 } 74 75 }
运行结果:
中午啦!到饭点喽!
妈妈准备--做饭。
妈妈准备--洗菜。
妈妈准备--切菜。
妈妈准备--炒菜,发现没有酱油,让儿子去买酱油!
儿子出门下楼。
儿子到达超,买到酱油!。
儿子回家上楼。
研究技术需要静下心来,一点一点地深究.......