线程join方法 小demo
1.第一个示例:
1 package cn.threaddemo; 2 3 public class T implements Runnable { 4 5 public static int a = 0; 6 7 @Override 8 public void run() { 9 System.out.print("t线程中的a:"); 10 for (int k = 0; k < 5; k++) { 11 a = a + 1; 12 System.out.print(" "+a); 13 } 14 } 15 16 public static void main(String[] args) throws Exception { 17 Runnable r = new T(); 18 Thread t = new Thread(r); 19 t.start(); 20 /* */ 21 System.out.println("主线程中的a:"+a); 22 } 23 24 }
输出结果:
主线程中的a:0
t线程中的a: 1 2 3 4 5
这是因为,当主线程 main方法执行 System.out.println("主线程中的a:"+a); 这条语句时,t 线程还没有真正开始运行,或许正在为它分配资源准备运行。因为为线程分配资源需要时间,而main方法执行完t.start()方法后继续往下执行System.out.println(a); 这个时候得到的结果是a还没有被改变的值0 。
2.Question: 怎样才能让主线程中的输出结果为5, join() 方法提供了这种功能,在第一个代码的基础上进行修改如下:
1 package cn.threaddemo; 2 3 public class T1 implements Runnable { 4 5 public static int a = 0; 6 7 @Override 8 public void run() { 9 System.out.print("t线程中的a:"); 10 for (int k = 0; k < 5; k++) { 11 a = a + 1; 12 System.out.print(" "+a); 13 } 14 } 15 16 public static void main(String[] args) throws Exception { 17 Runnable r = new T1(); 18 Thread t = new Thread(r); 19 t.start(); 20 t.join();//把线程t强制合并到主线程,使两个线程顺序执行,t线程执行完成后,再接着执行主线程 21 System.out.println("\n主线程中的a:"+a); 22 } 23 24 25 }
执行结果如下:
分析:thread.Join()方法把指定的线程加入到当前线程,可以将两个交替执行的线程合并为顺序执行的线程。 比如在线程B中调用了线程A的Join()方法,直到线程A执行完毕后,才会继续执行线程B。
第一个示例中t线程和主线程是交替运行,当主线程中加入t.join();语句后,线程执行顺序变成了:先执行线程t, t线程执行结束后再接着执行主线程,由原来的线程交替并行执行变成了顺序执行。
3. 另外一种方式实现主线程中输出5:让主线程休眠一定时间,这种方式不能保证t线程一定会比主线程先执行完,当主线程设置休眠时间比较长时,可以保证t线程先于主线程完成
当主线程设置休眠时间比较短时,就不一定能保证了
分类:
Java线程
【推荐】还在用 ECharts 开发大屏?试试这款永久免费的开源 BI 工具!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 如何在 .NET 中 使用 ANTLR4
· 后端思维之高并发处理方案
· 理解Rust引用及其生命周期标识(下)
· 从二进制到误差:逐行拆解C语言浮点运算中的4008175468544之谜
· .NET制作智能桌面机器人:结合BotSharp智能体框架开发语音交互
· 想让你多爱自己一些的开源计时器
· Cursor预测程序员行业倒计时:CTO应做好50%裁员计划
· 大模型 Token 究竟是啥:图解大模型Token
· 用99元买的服务器搭一套CI/CD系统
· 如何在 .NET 中 使用 ANTLR4