多线程学习----join()的用法

2023-10-27

join的用法一

  join()方法可以使得一个线程在另一个线程结束后再执行。如果join()方法在一个线程实例上调用,当前运行着的线程将阻塞直到这个线程实例完成了执行。
  首先来看个例子:

/**
* @author QingHe
* Creation on 2005-12-19
*/

public class ThreadTest implements Runnable {
public static int a = 0;

public void run() {
for (int k = 0; k < 5; k++) {
a = a + 1;
}
}

public static void main(String[] args) throws Exception {
Runnable r = new ThreadTest();
Thread t = new Thread(r);
t.start();
System.out.println(a);
}
}

  请问程序的输出结果是5吗?答案是:有可能。其实你很难遇到输出5的时候,通常情况下都不是5。当然这也和机器有严重的关系。为什么呢?我的解释是当主线程main方法执行System.out.println(a);这条语句时,线程还没有真正开始运行,或许正在为它分配资源准备运行吧。因为为线程分配资源需要时间,而main方法执行完t.start()方法后继续往下执行System.out.println(a);,这个时候得到的结果是a还没有被改变的值0。怎样才能让输出结果为5!其实很简单,join() 方法提供了这种功能。join() 方法,它能够使调用该方法的线程在此之前执行完毕。

public class ThreadTest implements Runnable {
public static int a = 0;

public void run() {
for (int k = 0; k < 5; k++) {
a = a + 1;
}
}

public static void main(String[] args) throws Exception {
Runnable r = new ThreadTest();
Thread t = new Thread(r);
t.start();
t.join();
System.out.println(a);
}
}

这个时候,程序输入结果始终为5。

  为了证明如果不使用t.join()方法,主线程main方法的System.out.println(a);语句将抢先执行,我们可以在main方法中加入一个循环,这个循环用来延长main方法执行的时间,循环次数将严重取决于机器性能。如果循环次数得当,我们也可以看到a的输出结果是5。

public class ThreadTest implements Runnable {
public static int a = 0;

public void run() {
for (int k=0; k<5; k++) {
a = a + 1;
}
}

public static void main(String[] args) throws Exception {
Runnable r = new ThreadTest();
Thread t = new Thread(r);
t.start();
for (int i=0; i<300; i++) {
/*
 注意循环体内一定要有实际执行语句,否则编译器或JVM可能优化掉你的这段代码,视这段代
 码为无效。             
*/
System.out.print(i);
}
System.out.println();
System.out.println(a);
}
}

  这时,在我的机器上,a的输出值始终为5。
以上内容的转载地址为:Java线程join()方法的用处

join的用法二

  在join()方法内设定超时,使得join()方法的影响在特定超时后无效。当超时时,主方法和任务线程申请运行的时候是平等的。然而,当涉及sleep时,join()方法依靠操作系统计时,所以你不应该假定join()方法将会等待你指定的时间。

join的原理

  join尽管像sleep一样,让主线程停下了,但是本质上是不同的,join的底层是通过wait实现的,sleep是在线程中不会释放锁,但是wait会释放锁。
  我想,大家肯定会对上边的说法有疑惑,既然join底层是wait,而wait会释放锁,那为什么还能停住主线程,让其等待子线程走完呢?
  经过我查找,发现有人说过,wait()的作用是让“当前线程”等待,而这里的“当前线程”是指当前在CPU上运行的线程。所以,虽然是调用子线程的wait()方法,但是它是通过“主线程”去调用的;所以,休眠的是主线程,而不是“子线程”!
换句话说,虽然是t.join() 但是里边其实是调用的主线程的wait方法

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

多线程学习----join()的用法 的相关文章

随机推荐

  • C++之泛型编程

    目录 模板 模板的特点 函数模板 前言 函数模板的使用方式 函数模板具体案例 使用模板的注意事项 普通函数与函数模板间的区别 具体案例 普通函数与函数模板调用规则 模板的局限性 具体化模板 类模板 前言 类模板与函数模板的区别 类模板中成员
  • JS URL的编码解码以及使用场景

    前端事件交互 有的时候会用到url作为参数 然而你会发现直接把url当个字符串来处理会发现有很多的局限性 比如说我想添加一个参数什么的 或者进行个解析比较麻烦 而且有的时候解析url有的时候因为特殊符号什么的也是个问题 于是有了JS的url
  • STDCnetwork BiSeNet 的实时语义分割的rethinking

    STDCnetwork Rethinking BiSeNet For Real time Semantic Segmentation重新思考 BiSeNet 的实时语义分割 BiSeNet 28 27 已被证明是一种流行的用于实时分割的双流
  • 关于新手Myeclipse(最新V2019.12.5) 第一次创建web project,运行JSP,详细步骤,所遇到的问题及解决方案。

    Myeclipse 创建web project 运行JSP 详细步骤 具体Myeclipse的安装及环境配置我不再赘述 我在这里用的Myeclipse的版本为V2019 12 5 打开Myeclipse 创建一个新的Workspaces 点
  • 一文读懂微生物扩增子16s测序

    微生物多样性测序结果如何看 做过16s测序的小伙伴们都知道 测完之后会拿到一份结果报告 但这并不代表可以开始写文章了 看似一大堆数据图表却不知如何下手 这是很多人头疼的地方 那么怎样给报告中的数据赋予灵魂 让它真正成为对你有帮助的分析呢 一
  • 一起来用Websocket(一)开篇 Websocket!Socket在HTML5复活

    注 本文源代码点此下载 一起来用websocket 一 开篇 websocket socket在html5复活 前言 html5中有一个比较好用的特性 就是websocket 现在已集成在chrome的较新版本中 由于前段时间在项目中有用到
  • 《计算机网络》——第五章知识点

    可靠 保证接收方进程从缓存区读出的字节流与发送方发出的字节流是完全一样的 确认重传不分家 TCP的发送方在规定的时间内没有收到确认就要重传已发送的报文段 流量控制 让发送方慢点 要让接收方来得及接收 TCP利用滑动窗口机制实现流量控制 在通
  • SpringBoot项目引入jar包

    在项目过程中 有时候需要引入本地的jar包 比如企业自己的jar包或者修改过的源码包 有两种方法可以使用 一 本地maven库 把jar包打到本地maven库 然后在pom文件中加上依赖 把jar和pom文件打到maven库的命令 mvn
  • Mybatis批量操作

    当下Java开发中 数据库操作多采用Mybatis框架 它支持定制化 SQL 存储过程以及高级映射 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集 很多时候 我们需要进行大量的数据操作 如果通过循环去逐个操作 这样会导致多次请
  • 大大大模型部署方案抛砖引玉

    作者 Oldpan 编辑 oldpan博客 点击下方卡片 关注 自动驾驶之心 公众号 ADAS巨卷干货 即可获取 点击进入 自动驾驶之心 模型部署 技术交流群 借着热点 简单聊聊大模型的部署方案 作为一个只搞过CV部署的算法工程师 在最近L
  • 想找一家好公司入职或者合作?那么这块天眼查GUI版本非常适合你。

    前言 天眼查是咱们都知道的一个网站了 就是可以通过这个网站来知道咱们想了解公司的一些情况 比如是不是濒临破产 有没有什么法律纠纷 所以今天在找合作公司的时候 就突发奇想的想着写一个天眼查的gui脚本 大家喜欢的话可以拿走练练手 开发工具 P
  • STM32学习笔记---电源管理

    一 STM32电源管理简介 1 电源管理简介 电源对电子设备的重要性不言而喻 它是保证系统稳定运行的基础 而保证系统能稳定运行后 又有低功耗的要求
  • web app和本地app之争 及其 iOS和Android之争

    2011年末的文章 当时还在学校 没有发表 今天贡献出来 今天和 1 我觉得你说其实是web app和本地app之争 我原来也看过别人讨论 我觉得这个看法好 如果以后多种平台并存 比如Ios Android wmphone bb 那么显然w
  • GO语言网络编程(并发编程)runtime包

    GO语言网络编程 并发编程 runtime包 1 runtime包 1 1 1 runtime Gosched 让出CPU时间片 重新等待安排任务 大概意思就是本来计划的好好的周末出去烧烤 但是你妈让你去相亲 两种情况第一就是你相亲速度非常
  • 使用PLCSIM Advanced仿真博途S7-1500 OPC UA

    你知道工控人平时在哪里交流 博途工控人社区 你知道工控人平时在哪里交流 博途工控人社区 准备工具 博途软件 UaExpert软件 UaExpert软件可以关注公众号并回复UaExpert获取 创建一个S7 1500PLC 为方便记忆 命名为
  • 数论-欧拉函数

    欧拉函数 在数论 对正整数n 欧拉函数是小于n的正整数中与n互质的数的数目 1 1 此函数以其首名研究者欧拉命名 Euler s totient function 它又称为Euler s totient function 函数 欧拉商数等
  • metasploit使用介绍

    文章目录 前言 一 metasploit介绍 1 产生原因 2 metasploit框架介绍 3 发展与壮大 二 使用metaspliot 1 模块介绍 2 模块命令基本使用 1 启动MSF 2 管理数据库 3 Msfconsole接口 4
  • [苹果开发者账号]04 申请苹果开发者账号 美国报税表

    申请苹果开发者账号时 当银行信息完成后 要填写美国报税表 填写时注意的地方 1 首先 选择报税表 使用默认的美国 2 填写美国报税表 中国的公司和中国人 全选否 3 填写详细的报税表 记录下红色箭头部分 选Corporation 公司 写报
  • python资料大全

    前言 Python是一种高级编程语言 已经成为了当今最受欢迎的编程语言之一 它被广泛用于Web开发 数据科学 人工智能 机器学习等领域 Python具有易学易用的特点 同时也具有强大的功能和灵活性 本篇博客将介绍Python的学习过程以及它
  • 多线程学习----join()的用法

    join的用法一 join 方法可以使得一个线程在另一个线程结束后再执行 如果join 方法在一个线程实例上调用 当前运行着的线程将阻塞直到这个线程实例完成了执行 首先来看个例子 author QingHe Creation on 2005