Java线程(学习整理)--2---加入另一个线程join

时间:2023-03-09 16:22:06
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、简单举例说明:

 package cn.sxt.joins;
/**
* 加入线程:join
*
* 模拟:妈妈做饭是让儿子去买酱油
* @author 小风微灵
*
*/ class M extends Thread{ public void run() {
System.err.println("中午啦!到饭点喽!");
System.out.println("妈妈准备--做饭。");
System.out.println("妈妈准备--洗菜。");
System.out.println("妈妈准备--切菜。");
System.out.println("妈妈准备--炒菜,发现没有酱油,让儿子去买酱油!"); S s=new S();
21 s.start();
try {
/**分析说明:
* 必须在启动子辅助线程的之后再调用join方法才会起到效果!
*
* join()效果:
* 当前线程执行过程中,临时加入一个辅助线程,那么此时,当前线程暂停,
* 待辅助线程执行结束之后,在继续执行当前线程!
*/
s.join(); //儿子买酱油加入到妈妈做菜的线程中去
} catch (InterruptedException e) {
e.printStackTrace();
} System.out.println("妈妈开始炒菜。");
System.out.println("饭做好了,一家人一起吃饭。"); }
} class S extends Thread{
public void run() {
System.out.println("儿子出门下楼。"); try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
} System.out.println("儿子到达超,买到酱油!。");
System.out.println("儿子回家上楼。"); try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
} System.out.println("儿子把酱油交给妈妈。");
}
} public class JoinThread { /**
* 启动程序
* @param args
*/
public static void main(String[] args) { new M().start();
} }

运行结果:

中午啦!到饭点喽!
妈妈准备--做饭。
妈妈准备--洗菜。
妈妈准备--切菜。
妈妈准备--炒菜,发现没有酱油,让儿子去买酱油!
儿子出门下楼。
儿子到达超,买到酱油!。
儿子回家上楼。