如何控制线程的执行

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

相关文章

如何使用 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

maven 编译构建可以执行的jar包

💝💝💝欢迎莅临我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:「stormsha的主页」👈,「stormsha的知识库」👈持续学习,不断总结,共同进步,为了踏实,做好当下事儿~ 专栏导航 Python系列: Python面试题合集,剑指大厂Git系列: Git操作技巧GO

jenkins 插件执行shell命令时,提示“Command not found”处理方法

首先提示找不到“Command not found,可能我们第一反应是查看目标机器是否已支持该命令,不过如果相信能找到这里来的朋友估计遇到的跟我一样,其实目标机器是没有问题的通过一些远程工具执行shell命令是可以执行。奇怪的就是通过jenkinsSSH插件无法执行,经一番折腾各种搜索发现是jenkins没有加载/etc/profile导致。 【解决办法】: 需要在jenkins调用shell脚

Lua 脚本在 Redis 中执行时的原子性以及与redis的事务的区别

在 Redis 中,Lua 脚本具有原子性是因为 Redis 保证在执行脚本时,脚本中的所有操作都会被当作一个不可分割的整体。具体来说,Redis 使用单线程的执行模型来处理命令,因此当 Lua 脚本在 Redis 中执行时,不会有其他命令打断脚本的执行过程。脚本中的所有操作都将连续执行,直到脚本执行完成后,Redis 才会继续处理其他客户端的请求。 Lua 脚本在 Redis 中原子性的原因

Smarty模板执行原理

为了实现程序的业务逻辑和内容表现页面的分离从而提高开发速度,php 引入了模板引擎的概念,php 模板引擎里面最流行的可以说是smarty了,smarty因其功能强大而且速度快而被广大php web开发者所认可。本文将记录一下smarty模板引擎的工作执行原理,算是加深一下理解。 其实所有的模板引擎的工作原理是差不多的,无非就是在php程序里面用正则匹配将模板里面的标签替换为php代码从而将两者

(function() {})();只执行一次

测试例子: var xx = (function() {     (function() { alert(9) })(); alert(10)     return "yyyy";  })(); 调用: alert(xx); 在调用的时候,你会发现只弹出"yyyy"信息,并不见弹出"10"的信息!这也就是说,这个匿名函数只在立即调用的时候执行一次,这时它已经赋予了给xx变量,也就是只是

Java程序到CPU上执行 的步骤

相信很多的小伙伴在最初学习编程的时候会容易产生一个疑惑❓,那就是编写的Java代码究竟是怎么一步一步到CPU上去执行的呢?CPU又是如何执行的呢?今天跟随小编的脚步去化解开这个疑惑❓。 在学习这个过程之前,我们需要先讲解一些与本内容相关的知识点 指令 指令是指导CPU运行的命令,主要由操作码+被操作数组成。 其中操作码用来表示要做什么动作,被操作数是本条指令要操作的数据,可能是内存地址,也