如何控制线程的执行

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

相关文章

C++统计函数执行时间的最佳实践

《C++统计函数执行时间的最佳实践》在软件开发过程中,性能分析是优化程序的重要环节,了解函数的执行时间分布对于识别性能瓶颈至关重要,本文将分享一个C++函数执行时间统计工具,希望对大家有所帮助... 目录前言工具特性核心设计1. 数据结构设计2. 单例模式管理器3. RAII自动计时使用方法基本用法高级用法

Java实现远程执行Shell指令

《Java实现远程执行Shell指令》文章介绍使用JSch在SpringBoot项目中实现远程Shell操作,涵盖环境配置、依赖引入及工具类编写,详解分号和双与号执行多指令的区别... 目录软硬件环境说明编写执行Shell指令的工具类总结jsch(Java Secure Channel)是SSH2的一个纯J

python 线程池顺序执行的方法实现

《python线程池顺序执行的方法实现》在Python中,线程池默认是并发执行任务的,但若需要实现任务的顺序执行,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋... 目录方案一:强制单线程(伪顺序执行)方案二:按提交顺序获取结果方案三:任务间依赖控制方案四:队列顺序消

Go语言连接MySQL数据库执行基本的增删改查

《Go语言连接MySQL数据库执行基本的增删改查》在后端开发中,MySQL是最常用的关系型数据库之一,本文主要为大家详细介绍了如何使用Go连接MySQL数据库并执行基本的增删改查吧... 目录Go语言连接mysql数据库准备工作安装 MySQL 驱动代码实现运行结果注意事项Go语言执行基本的增删改查准备工作

解密SQL查询语句执行的过程

《解密SQL查询语句执行的过程》文章讲解了SQL语句的执行流程,涵盖解析、优化、执行三个核心阶段,并介绍执行计划查看方法EXPLAIN,同时提出性能优化技巧如合理使用索引、避免SELECT*、JOIN... 目录1. SQL语句的基本结构2. SQL语句的执行过程3. SQL语句的执行计划4. 常见的性能优

Spring Bean初始化及@PostConstruc执行顺序示例详解

《SpringBean初始化及@PostConstruc执行顺序示例详解》本文给大家介绍SpringBean初始化及@PostConstruc执行顺序,本文通过实例代码给大家介绍的非常详细,对大家的... 目录1. Bean初始化执行顺序2. 成员变量初始化顺序2.1 普通Java类(非Spring环境)(

Spring Boot 中的默认异常处理机制及执行流程

《SpringBoot中的默认异常处理机制及执行流程》SpringBoot内置BasicErrorController,自动处理异常并生成HTML/JSON响应,支持自定义错误路径、配置及扩展,如... 目录Spring Boot 异常处理机制详解默认错误页面功能自动异常转换机制错误属性配置选项默认错误处理

如何在Java Spring实现异步执行(详细篇)

《如何在JavaSpring实现异步执行(详细篇)》Spring框架通过@Async、Executor等实现异步执行,提升系统性能与响应速度,支持自定义线程池管理并发,本文给大家介绍如何在Sprin... 目录前言1. 使用 @Async 实现异步执行1.1 启用异步执行支持1.2 创建异步方法1.3 调用

Spring Boot Maven 插件如何构建可执行 JAR 的核心配置

《SpringBootMaven插件如何构建可执行JAR的核心配置》SpringBoot核心Maven插件,用于生成可执行JAR/WAR,内置服务器简化部署,支持热部署、多环境配置及依赖管理... 目录前言一、插件的核心功能与目标1.1 插件的定位1.2 插件的 Goals(目标)1.3 插件定位1.4 核

mybatis执行insert返回id实现详解

《mybatis执行insert返回id实现详解》MyBatis插入操作默认返回受影响行数,需通过useGeneratedKeys+keyProperty或selectKey获取主键ID,确保主键为自... 目录 两种方式获取自增 ID:1. ​​useGeneratedKeys+keyProperty(推