多线程二 线程常用的方法
发布日期:2022-04-11 08:52:49 浏览次数:5 分类:技术文章

本文共 2833 字,大约阅读时间需要 9 分钟。

线程常用的方法

在这里插入图片描述

1. 获取并设置线程名称

取得当前JVM中正在执行的线程对象

静态方法直接调用

Thread.currentThread.getName(); //获取当前线程的名称

线程命名的两中方式:

在创建线程时通过构造方法来传入名称

new Thread(run,"线程A").start();

通过set方法来设置线程名称


在这里插入图片描述

  • sleep:抱着资源在睡觉

  • yield: 文明礼让有先序

  • join: 插队优先是大哥


2. 线程休眠

sleep(long time<毫秒>)

sleep方法是静态方法,直接通过Thread类名称来调用。在哪个线程中调用,就休眠当前线程

  • 让线程暂缓执行,sleep()会让当前线程从RUNNING进入到TIME_WAITTING状态,时间到达后处于就绪状态,并不是出于运行状态
  • sleep方法会让当前线程立即交出CPU,但不会释放对象锁
  • interrupt()可以打断正在睡眠的线程,此时sleep方法会抛出InterruptedException
  • sleep可以模拟网络延时,倒计时等,要精确控制时间单位用TimeUnit

在这里插入图片描述


3. 线程让步

Thread.yield()方法作用是:当前线 程暂停执行,让出CPU给他线程。

yield是让当前运行线程回到就绪状态,以允许具有相同优先级的其他线程获得运行机会。因此,使用yield()的目的是让相同优先级的线程之间能适当的轮转执行

但是,礼让却不一定能够成功,实际中无法保证yield达到让步目的,还取决于操作系统的任务调度器。

结论:yield从未导致线程转到等待/睡眠/阻塞状态。在大多数情况下,yield()将导致线程从运行状态转到可运行状态,但有可能没有效果,礼让不一定会成功

在这里插入图片描述

【yield要点归纳】

  • 暂停当前正在执行的线程对象,并执行其他线程(只供相同优先级的线程使用)

  • 当前线程不会立即交出CPU,不释放锁,交出时间由系统调度

  • 礼让不一定成功(当前礼让的线程有可能再次被调度)

  • 从运行状态返回就绪状态

案例一

class ThreadYield implements Runnable {
@Override public void run() {
System.out.println(Thread.currentThread().getName() + "-->开始执行"); Thread.yield(); System.out.println(Thread.currentThread().getName() + "<--结束执行"); }}public class ThreadYeild {
public static void main(String[] args) {
ThreadYield ty = new ThreadYield(); new Thread(ty,"A线程").start(); new Thread(ty,"B线程").start(); }}

礼让失败:

B线程被CPU调度,遇到了yield方法礼让,回到就绪态。此时,线程B再次被CPU调度,B线程结束执行

在这里插入图片描述
礼让成功:

B线程被CPU调度,遇到了yield方法礼让,回到就绪态。此时,线程A被CPU调度,A线程开始执行

在这里插入图片描述

案例二

【线程让步测试】

  • 在线程2中调用yield方法, 将线程2的调度时间分给线程1
  • 最终 [线程A] count1 > count2 [线程B]
public class YieldTest {
public static void main(String[] args) {
new Thread(() -> {
int count1 = 0; for(;;) System.out.println("----->[1]" + (count1++)); }, "线程A").start(); new Thread(() -> {
int count2 = 0; for(;;) {
Thread.yield(); System.out.println(" ----->[2]" + (count2++)); } }, "线程B").start(); }}

在这里插入图片描述

但是,结果并不一定差别很大。线程的调度最终取决于操作系统的任务调度器。
在这里插入图片描述


4. 线程等待

  • 若线程1需要等待线程2执行完毕后再恢复执行,可以在线程1中调用线程2的join()

  • 在哪个线程中调用,哪个线程被阻塞,等待插队的线程执行完毕后当前线程再恢复执行

  • 从运行态到阻塞态会释放锁

在这里插入图片描述

通过一段代码来验证一下

  • 在主线程中让线程B的插队(调用线程B的join方法),那么线程A阻塞,直到线程B执行完毕,
  • 线程A继续执行(回到就绪)
public class ThreadJoin implements Runnable{
@Override public void run() {
for (int i = 0; i < 500; i++) {
System.out.println(Thread.currentThread().getName() + "插队线程来了-->" + i); } } public static void main(String[] args) throws InterruptedException {
ThreadJoin tj = new ThreadJoin(); Thread thread = new Thread(tj); thread.start(); //主线程任务 for (int i = 0; i < 100; i++) {
if (i == 90) {
thread.join(); } System.out.println("main线程执行" + i); } }}

在这里插入图片描述

在这里插入图片描述
主线程在运行中,当i = 90时Thread-0插队。此时主线程被阻塞,Thread-0执行完成后,主线程继续执行

转载地址:https://iqqcode.blog.csdn.net/article/details/96747800 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!

上一篇:多线程二(碌碌无为,平平凡凡)
下一篇:多线程事物控制

发表评论

最新留言

关注你微信了!
[***.104.42.241]2024年03月24日 09时11分57秒

关于作者

    喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!

推荐文章

二进制小数的意义 2019-04-26
【方法】用Quartus II开发Altera公司的FPGA,如何给引脚配置上电初始电平 2019-04-26
在Quartus II 13.0中用ModelSim-Altera 10.1d进行波形仿真,若修改了Verilog代码,如何不关闭窗口重新用新的代码来仿真 2019-04-26
通过几段代码理解Verilog里面阻塞赋值和非阻塞赋值的区别,以及Verilog的for循环的使用 2019-04-26
FPGA Verilog字符串转数字,以及数字转字符串的方法 2019-04-26
在Verilog中用for循环实现字符串长度获取、字符串连接、字符串转数字以及数字转字符串(一) 2019-04-26
在Vivado 2020.1中用MIG核读写DDR3内存,编译代码时提示Sub-optimal placement错误的解决办法 2019-04-26
【方法】Verilog取变量位宽的时候含有变量怎么办 2019-04-26
Vivado中ILA显示信号不全的解决办法 2019-04-26
FPGA实际运行时,寄存器(变量)的值乱跳的解决办法 2019-04-26
Xilinx MIG核读写DDR3内存,连续读写内存的正确方法(时序)及代码 2019-04-26
Xilinx 2020.1 MIG核读写DDR3内存,新建工程时配置MIG核的完整步骤 2019-04-26
Xilinx Vitis 2020.1无法创建SREC SPI Bootloader工程,提示缺少xilisf库的解决办法 2019-04-26
【程序】Xilinx FPGA将DDR3内存转换为W25Q256的SPI接口,供STM32单片机调用,产生容量为256MB的USB U盘设备 2019-04-26
Xilinx Vitis 2020.1修改工程占用的BRAM内存大小的方法 2019-04-26
Xilinx Vitis 2020.1用SREC SPI Bootloader固化Microblaze程序,断电再通电后程序运行不了的解决办法 2019-04-26
【教程】Xilinx Vivado/Vitis 2020.1创建最简单的MicroBlaze工程运行Hello World C语言程序(不使用外部DDR3内存),并固化到SPI Flash 2019-04-26
Xilinx Vivado 2020.1里面AXI Interrupt Controller无法选择中断的个数 2019-04-26
关于Xilinx Vitis 2020.1里面MicroBlaze软核的sleep函数卡死的问题 2019-04-26
Xilinx Vitis 2020.1里面运行C程序时提示找不到microblaze_0 2019-04-26