java多线程join的作用与用法
Java  /  管理员 发布于 4年前   301
对于JAVA的join,JDK 是这样说的:join public final void join (long millis )throws InterruptedException Waits at most millis milliseconds for this thread to die. A timeout of 0 means to wait forever。字面意思是等待一段时间直到这个线程死亡。
有这样一种应用场景,主线程启动几个子线程分别同时去作一些事情,主线程需等这些子线程都结束后,才能往下执行(如需要获得子线程的结果信息)
面对这样的场景,我们有几种思路:
1.启动子线程后,让主线程sleep一段时间
这种方式最不靠谱,因为我们不知道要让主线程休眠多长时间
实例1:
package com.bijian.study.thread;public class MyThread extends Thread {boolean negative = true;double pi; // Initializes to 0.0, by defaultpublic void run() {for (int i = 3; i < 100000; i += 2) {if (negative)pi -= (1.0 / i);elsepi += (1.0 / i);negative = !negative;}pi += 1.0;pi *= 4.0;System.out.println("Finished calculating PI");}}
主线程:
package com.bijian.study.thread;public class MainThread {public static void main(String[] args) {MyThread mt = new MyThread();mt.start();try {Thread.sleep(10); // Sleep for 10 milliseconds} catch (InterruptedException e) {}System.out.println("pi = " + mt.pi);}}
运行结果:
Finished calculating PIpi = 3.1415726535897894
2.sleep一段时间不靠谱,于是还可以来个循环,判断子线程是否还活着
实例2(修改实例1的主线程):
package com.bijian.study.thread;public class MainThread2 {public static void main(String[] args) {MyThread mt = new MyThread();mt.start();while (mt.isAlive())try {Thread.sleep(10); // Sleep for 10 milliseconds} catch (InterruptedException e) {e.printStackTrace();}System.out.println("pi = " + mt.pi);}}
运行结果:
Finished calculating PIpi = 3.1415726535897894
这样,效果是达到了,但在主线程里写个循环,不是高性能的方法。
3.join很好的解决此应用场景
实例3(修改实例1的主线程):
package com.bijian.study.thread;public class MainThread3 {public static void main(String[] args) {MyThread mt = new MyThread();mt.start();try {mt.join();} catch (InterruptedException e) {}System.out.println("pi = " + mt.pi);}}
运行结果:
Finished calculating PIpi = 3.1415726535897894
扩展下实例3,就能很好的解决主线程启动几个子线程分别同时去作一些事情,主线程需等这些子线程都结束后,才能往下执行。如下所示:
实例4:
1.新建一个子线程
package com.bijian.study.thread;public class MyThread2 extends Thread {boolean negative = true;double res; // Initializes to 0.0, by defaultpublic void run() {for (int i = 1; i < 100; i += 2) {if (negative)res -= (1.0 / i);elseres += (1.0 / i);negative = !negative;}System.out.println("Finished calculating res");}}
2.修改实例1的主线程
package com.bijian.study.thread;public class MainThread3 {public static void main(String[] args) {//创建并启动子线程1MyThread mt = new MyThread();mt.start();//创建并启动子线程2MyThread2 mt2 = new MyThread2();mt2.start();try {mt.join();mt2.join();} catch (InterruptedException e) {}System.out.println("pi = " + mt.pi);System.out.println("res = " + mt2.res);}}
运行结果:
Finished calculating resFinished calculating PIpi = 3.1415726535897894res = -0.7803986631477527
123 在
Clash for Windows作者删库跑路了,github已404中评论 按理说只要你在国内,所有的流量进出都在监控范围内,不管你怎么隐藏也没用,想搞你分..原梓番博客 在
在Laravel框架中使用模型Model分表最简单的方法中评论 好久好久都没看友情链接申请了,今天刚看,已经添加。..博主 在
佛跳墙vpn软件不会用?上不了网?佛跳墙vpn常见问题以及解决办法中评论 @1111老铁这个不行了,可以看看近期评论的其他文章..1111 在
佛跳墙vpn软件不会用?上不了网?佛跳墙vpn常见问题以及解决办法中评论 网站不能打开,博主百忙中能否发个APP下载链接,佛跳墙或极光..路人 在
php中使用hyperf框架调用讯飞星火大模型实现国内版chatgpt功能示例中评论 教程很详细,如果加个前端chatgpt对话页面就完美了..Copyright·© 2019 侯体宗版权所有· 粤ICP备20027696号