如何控制线程的执行

2024-01-01 11:40
文章标签 执行 控制线

本文主要是介绍如何控制线程的执行,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

文章目录

  • 时间片的概念
  • 注意事项
  • setPriority(int) : 设置线程优先级别
  • static sleep(long) : 让当前线程休眠指定的毫秒数~
  • static yield() : 让当前线程放弃已经持有的时间片 直接返回就绪状态**
  • join() : 让当前线程邀请另一个线程优先执行

时间片的概念

时间片即CPU分配给各个程序的时间,每个线程被分配一个时间段,称作它的时间片,即该进程允许运行的时间,使各个程序从表面上看是同时进行的。

注意事项

线程章节所有主动进入阻塞状态的方法 都需要进行异常处理
因为Ta们都有throws InterruptedException的声明 而这时一个非运行时异常 必须处理

线程章节所有的静态方法 不要关注谁调用方法 而要关注
调用出现在谁的线程体当中 出现在哪个线程体当中 就是操作哪个线程

setPriority(int) : 设置线程优先级别

可选范围1-10 默认优先级为5
线程优先级越高 代表抢到时间片的概率越高~

public class TestSetPriority{public static void main(String[] args){ThreadOne t1 = new ThreadOne();ThreadTwo t2 = new ThreadTwo();t1.setPriority(10);//个子高 抢到篮板球的概率高t2.setPriority(1);//你懂~t1.start();//t2.start();}
}
class ThreadOne extends Thread{@Overridepublic void run(){while(true){System.out.println("小明 去图书馆看书吗? 不!我还要打篮球");}}
}
class ThreadTwo extends Thread{@Overridepublic void run(){while(true){System.out.println("小明 去打篮球吗?不!我还要写小说拍电影~");}}
}

static sleep(long) : 让当前线程休眠指定的毫秒数~

public class TestSleep{public static void main(String[] args)throws Exception{EtoakThread et = new EtoakThread();et.start();et.sleep(5000);while(true){System.out.println("叶莉~");}}
}
class EtoakThread extends Thread{@Overridepublic void run(){try{sleep(5000);}catch(Exception e){e.printStackTrace();}while(true){System.out.println("姚明~");}}
}

static yield() : 让当前线程放弃已经持有的时间片 直接返回就绪状态**

public class TestYield{public static void main(String[] args){NumThread nt = new NumThread();CharThread ct = new CharThread();nt.start();ct.start();}
}
//并允许其它线程去运行 != 并执行其它线程
class NumThread extends Thread{@Overridepublic void run(){for(int i = 1;i<=26;i++){System.out.println(i);Thread.yield();}}
}
class CharThread extends Thread{@Overridepublic void run(){for(char c = 'a';c<='z';c++){System.out.println(c);Thread.yield();}}
}

join() : 让当前线程邀请另一个线程优先执行

在被邀请的线程执行结束之前 主动邀请别人的当前线程不再执行 一直阻塞

一个主动邀请别人的线程: 当前处于运行状态的线程 = join写在谁的线程体当中
被邀请优先执行的线程: 主动调用方法的那个线程

public class TestJoin{public static void main(String[] args)throws Exception{EtoakThread et = new EtoakThread();et.start();et.join(); //雷锋:主线程  被邀请:etfor(int i = 0;i<1000;i++){System.out.println("梦回吹角连营~");}}
}
class EtoakThread extends Thread{@Overridepublic void run(){for(int i = 0;i<1000;i++){System.out.println("醉里挑灯看剑~");}}
}

小总结

到现在为止 线程类的方法:
run() start() setPriority() sleep() yield() join()

小练习

《西游记》一个向往美好的和尚 与诸多动物一起旅游的故事~

故事涉及一堆线程:

有一个师傅线程 打印999次 “Only you 能伴我取西经…”
有一个猴哥线程 打印888次 “俺老孙来也~”
有一个八戒线程打印777次 “分行李吧 回高老庄”
有一个沙僧线程 打印666次 “大师兄不好了 师傅被妖怪抓走了~”

师傅天天逼逼叨很烦很烦 请将他的优先级设置为最低: setPriority(int);
猴哥想要给师弟们更多的表现机会于是前三次得到时间片都会主动放弃: yield();
八戒很懒 在执行操作之前要先休眠300毫秒: sleep(long);
沙僧很依赖猴哥 猴哥不死 他绝对不上: join();

答案在最后 先自己写哦~

在这里插入图片描述

public class BigOne{public static void main(String[] args){SF sf = new SF();sf.setPriority(1);sf.start();WK wk = new WK();wk.start();WN wn = new WN();wn.start();WJ wj = new WJ(wk);wj.start();}
}
class SF extends Thread{@Overridepublic void run(){for(int i = 0;i<999;i++){System.out.println("Only You 能伴我取西经~");}}
}
class WK extends Thread{@Overridepublic void run(){yield();yield();yield();for(int i = 0;i<888;i++){System.out.println("俺老孙来也~");}}
}
class WN extends Thread{@Overridepublic void run(){try{sleep(300);}catch(Exception e){e.printStackTrace();}for(int i = 0;i<777;i++){System.out.println("分行李吧 回高老庄~");}}
}
class WJ extends Thread{WK hg;public WJ(WK hg){this.hg = hg;}@Overridepublic void run(){try{hg.join();}catch(Exception e){e.printStackTrace();}for(int i = 0;i<666;i++){System.out.println("大师兄不好了 师傅被妖怪抓走了~");}}
}

这篇关于如何控制线程的执行的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/559141

相关文章

Spring定时任务只执行一次的原因分析与解决方案

《Spring定时任务只执行一次的原因分析与解决方案》在使用Spring的@Scheduled定时任务时,你是否遇到过任务只执行一次,后续不再触发的情况?这种情况可能由多种原因导致,如未启用调度、线程... 目录1. 问题背景2. Spring定时任务的基本用法3. 为什么定时任务只执行一次?3.1 未启用

grom设置全局日志实现执行并打印sql语句

《grom设置全局日志实现执行并打印sql语句》本文主要介绍了grom设置全局日志实现执行并打印sql语句,包括设置日志级别、实现自定义Logger接口以及如何使用GORM的默认logger,通过这些... 目录gorm中的自定义日志gorm中日志的其他操作日志级别Debug自定义 Loggergorm中的

JavaScript中的reduce方法执行过程、使用场景及进阶用法

《JavaScript中的reduce方法执行过程、使用场景及进阶用法》:本文主要介绍JavaScript中的reduce方法执行过程、使用场景及进阶用法的相关资料,reduce是JavaScri... 目录1. 什么是reduce2. reduce语法2.1 语法2.2 参数说明3. reduce执行过程

在MySQL执行UPDATE语句时遇到的错误1175的解决方案

《在MySQL执行UPDATE语句时遇到的错误1175的解决方案》MySQL安全更新模式(SafeUpdateMode)限制了UPDATE和DELETE操作,要求使用WHERE子句时必须基于主键或索引... mysql 中遇到的 Error Code: 1175 是由于启用了 安全更新模式(Safe Upd

Spring Boot 整合 ShedLock 处理定时任务重复执行的问题小结

《SpringBoot整合ShedLock处理定时任务重复执行的问题小结》ShedLock是解决分布式系统中定时任务重复执行问题的Java库,通过在数据库中加锁,确保只有一个节点在指定时间执行... 目录前言什么是 ShedLock?ShedLock 的工作原理:定时任务重复执行China编程的问题使用 Shed

详解如何在React中执行条件渲染

《详解如何在React中执行条件渲染》在现代Web开发中,React作为一种流行的JavaScript库,为开发者提供了一种高效构建用户界面的方式,条件渲染是React中的一个关键概念,本文将深入探讨... 目录引言什么是条件渲染?基础示例使用逻辑与运算符(&&)使用条件语句列表中的条件渲染总结引言在现代

如何使用 Bash 脚本中的time命令来统计命令执行时间(中英双语)

《如何使用Bash脚本中的time命令来统计命令执行时间(中英双语)》本文介绍了如何在Bash脚本中使用`time`命令来测量命令执行时间,包括`real`、`user`和`sys`三个时间指标,... 使用 Bash 脚本中的 time 命令来统计命令执行时间在日常的开发和运维过程中,性能监控和优化是不

C#如何优雅地取消进程的执行之Cancellation详解

《C#如何优雅地取消进程的执行之Cancellation详解》本文介绍了.NET框架中的取消协作模型,包括CancellationToken的使用、取消请求的发送和接收、以及如何处理取消事件... 目录概述与取消线程相关的类型代码举例操作取消vs对象取消监听并响应取消请求轮询监听通过回调注册进行监听使用Wa

PHP执行php.exe -v命令报错的解决方案

《PHP执行php.exe-v命令报错的解决方案》:本文主要介绍PHP执行php.exe-v命令报错的解决方案,文中通过图文讲解的非常详细,对大家的学习或工作有一定的帮助,需要的朋友可以参考下... 目录执行phpandroid.exe -v命令报错解决方案执行php.exe -v命令报错-PHP War

Oracle数据库执行计划的查看与分析技巧

《Oracle数据库执行计划的查看与分析技巧》在Oracle数据库中,执行计划能够帮助我们深入了解SQL语句在数据库内部的执行细节,进而优化查询性能、提升系统效率,执行计划是Oracle数据库优化器为... 目录一、什么是执行计划二、查看执行计划的方法(一)使用 EXPLAIN PLAN 命令(二)通过 S