当前位置: 首页 > news >正文

【多线程 - 04、Join 方法与 wait 方法】

Join 方法

Thread类中的join方法的主要作用就是同步,它可以使得线程之间的并发执行变为串行执行

样例:

public class JoinTest {public static void main(String [] args) throws InterruptedException {ThreadJoinTest t1 = new ThreadJoinTest("小明");ThreadJoinTest t2 = new ThreadJoinTest("小东");t1.start();/**join的意思是使得放弃当前线程的执行,并返回对应的线程,例如下面代码的意思就是:程序在main线程中调用t1线程的join方法,则main线程放弃cpu控制权,并返回t1线程继续执行直到线程t1执行完毕所以结果是t1线程执行完后,才到主线程执行,相当于在main线程中同步t1线程,t1执行完了,main线程才有执行的机会*/t1.join();//注意:是放弃当前线程,当前线程为主线程,所以,t2.start()如果放在前面,t1和t2线程还会竞争资源t2.start();}
}
class ThreadJoinTest extends Thread{public ThreadJoinTest(String name){super(name);}@Overridepublic void run(){for(int i=0;i<1000;i++){System.out.println(this.getName() + ":" + i);}}
}

join方法的作用

在A线程中调用了B线程的join()方法时,表示只有当B线程执行完毕时,A线程才能继续执行。

传参

join方法其实也可以接收参数的,join方法中如果传入参数,则表示这样的意思:如果A线程中调用B线程的join(10),则表示A线程会等待B线程执行10毫秒,10毫秒过后,A、B线程并发执行。需要注意的是,jdk规定,join(0)的意思不是A线程等待B线程0秒,而是A线程等待B线程无限时间,直到B线程执行完毕,即join(0)等价于join()。

join与start调用顺序问题

join方法必须在线程start方法调用之后调用才有意义。
很容易理解:如果一个线程都没有start,那它也就无法同步了。

sleep 方法

方法介绍

  • sleep(long millis) 线程睡眠 millis 毫秒
  • sleep(long millis, int nanos) 线程睡眠 millis 毫秒 + nanos 纳秒

调用sleep

因为sleep()是静态方法,所以最好的调用方法就是 Thread.sleep()。

sleep方法是让哪个线程睡眠

结论:sleep方法只能让当前线程睡眠。调用某一个线程类的对象t.sleep(),睡眠的不是t,而是当前线程。线程的sleep方法应该写在线程的run()方法里,就能让对应的线程睡眠。

控制线程睡眠的其他方法

  • TimeUnit.SECONDS.sleep(1);
  • TimeUnit.MINUTES.sleep(1);
  • TimeUnit.HOURS.sleep(1);
  • TimeUnit.DAYS.sleep(1);

作用和sleep一样,但是程序可读行更高,在项目中,推荐这种写法。

相关文章:

  • postman调用接口报{“detail“:“Method \“DELETE\“ not allowed.“}错误, 解决记录
  • Spark3.0中的AOE、DPP和Hint增强
  • C++知识点梳理:移动语意、右值
  • js实现对象数组去重
  • kali命令行下python多版本切换
  • 2023年数维杯国际大学生数学建模挑战赛
  • js设置图片放大缩小拖动
  • [工业自动化-19]:西门子S7-15xxx编程 - 软件编程 - PLC程序块、组织块OB与PLC多线程原理、OB、FC、FB、DB
  • STM32与RTOS的整合:实时操作系统在嵌入式开发中的应用
  • 自定义Graph Component:1.2-其它Tokenizer具体实现
  • 卫星通信和800MHz双管齐下,中国电信对中国移动发起新挑战
  • 55基于matlab的1.高斯噪声2.瑞利噪声3.伽马噪声4.均匀分布噪声5.脉冲(椒盐)噪声
  • Java 算法篇-深入了解单链表的反转(实现:用 5 种方式来具体实现)
  • 数据结构 栈(C语言实现)
  • 半导体应用系统一些小知识收集(stripwafer mapping,EAPscada)
  • ➹使用webpack配置多页面应用(MPA)
  • 4个实用的微服务测试策略
  • css的样式优先级
  • eclipse(luna)创建web工程
  • export和import的用法总结
  • gops —— Go 程序诊断分析工具
  • JAVA_NIO系列——Channel和Buffer详解
  • Java-详解HashMap
  • Koa2 之文件上传下载
  • Sequelize 中文文档 v4 - Getting started - 入门
  • Shell编程
  • Vue学习第二天
  • -- 查询加强-- 使用如何where子句进行筛选,% _ like的使用
  • 动手做个聊天室,前端工程师百无聊赖的人生
  • 技术攻略】php设计模式(一):简介及创建型模式
  • 嵌入式文件系统
  • 如何利用MongoDB打造TOP榜小程序
  • 时间复杂度与空间复杂度分析
  • 使用Swoole加速Laravel(正式环境中)
  • 仓管云——企业云erp功能有哪些?
  • ###C语言程序设计-----C语言学习(6)#
  • #define MODIFY_REG(REG, CLEARMASK, SETMASK)
  • (27)4.8 习题课
  • (aiohttp-asyncio-FFmpeg-Docker-SRS)实现异步摄像头转码服务器
  • (zhuan) 一些RL的文献(及笔记)
  • (附源码)ssm本科教学合格评估管理系统 毕业设计 180916
  • (过滤器)Filter和(监听器)listener
  • (力扣记录)235. 二叉搜索树的最近公共祖先
  • (转)c++ std::pair 与 std::make
  • ***linux下安装xampp,XAMPP目录结构(阿里云安装xampp)
  • .axf 转化 .bin文件 的方法
  • .NET 4.0中使用内存映射文件实现进程通讯
  • .NET 8 中引入新的 IHostedLifecycleService 接口 实现定时任务
  • .net 受管制代码
  • .NET/C# 反射的的性能数据,以及高性能开发建议(反射获取 Attribute 和反射调用方法)
  • .NET国产化改造探索(三)、银河麒麟安装.NET 8环境
  • .net实现客户区延伸至至非客户区
  • .net下简单快捷的数值高低位切换
  • /etc/sudoers (root权限管理)
  • [ 云计算 | Azure 实践 ] 在 Azure 门户中创建 VM 虚拟机并进行验证