多线程 Thread.yield 方法到底有什么用?
概念
我们知道 start() 方法是启动线程,让线程变成就绪状态等待 CPU 调度后执行。
那 yield() 方法是干什么用的呢?来看下源码。
/**
* A hint to the scheduler that the current thread is willing to yield
* its current use of a processor. The scheduler is free to ignore this
* hint.
*
* <p> Yield is a heuristic attempt to improve relative progression
* between threads that would otherwise over-utilise a CPU. Its use
* should be combined with detailed profiling and benchmarking to
* ensure that it actually has the desired effect.
*
* <p> It is rarely appropriate to use this method. It may be useful
* for debugging or testing purposes, where it may help to reproduce
* bugs due to race conditions. It may also be useful when designing
* concurrency control constructs such as the ones in the
* {@link java.util.concurrent.locks} package.
*/
public static native void yield();
yield 即 "谦让",也是 Thread 类的方法。它让掉当前线程 CPU 的时间片,使正在运行中的线程重新变成就绪状态,并重新竞争 CPU 的调度权。它可能会获取到,也有可能被其他线程获取到。
实战
下面是一个使用示例。
/**
* 微信公众号:Java技术栈
*/
public static void main(String[] args) {
Runnable runnable = () -> {
for (int i = 0; i <= 100; i++) {
System.out.println(Thread.currentThread().getName() + "-----" + i);
if (i % 20 == 0) {
Thread.yield();
}
}
};
new Thread(runnable, "栈长").start();
new Thread(runnable, "小蜜").start();
}
这个示例每当执行完 20 个之后就让出 CPU,每次谦让后就会马上获取到调度权继续执行。
运行以上程序,可以有以下两种结果。
结果1:栈长让出了 CPU 资源,小蜜成功上位。
栈长-----29
栈长-----30
小蜜-----26
栈长-----31
结果2:栈长让出了 CPU 资源,栈长继续运行。
栈长-----28
栈长-----29
栈长-----30
栈长-----31
而如果我们把两个线程加上线程优先级,那输出的结果又不一样。
thread1.setPriority(Thread.MIN_PRIORITY);
thread2.setPriority(Thread.MAX_PRIORITY);
因为给小蜜加了最高优先权,栈长加了最低优先权,即使栈长先启动,那小蜜还是有很大的概率比栈长先会输出完的,大家可以试一下。
yield 和 sleep 的异同
1)yield, sleep 都能暂停当前线程,sleep 可以指定具体休眠的时间,而 yield 则依赖 CPU 的时间片划分。
2)yield, sleep 两个在暂停过程中,如已经持有锁,则都不会释放锁资源。
3)yield 不能被中断,而 sleep 则可以接受中断。
总结
栈长没用过 yield,感觉没什么鸟用。
如果一定要用它的话,一句话解释就是:
yield 方法可以很好的控制多线程,如执行某项复杂的任务时,如果担心占用资源过多,可以在完成某个重要的工作后使用 yield 方法让掉当前 CPU 的调度权,等下次获取到再继续执行,这样不但能完成自己的重要工作,也能给其他线程一些运行的机会,避免一个线程长时间占有 CPU 资源。
原文发布时间为:2018-11-20
本文作者: 栈长

低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
-
上一篇
IDEA一定要改的八条配置
引言 坦白说,我很少写这种操作类型的文章。因为这种文章没啥新意,大家操作步骤肯定是一样的。然而,我答应了我的同事小阳,给她出一篇!毕竟人家打算从Eclipse转IDEA了,于是以示鼓励,写一篇给她! 那么是哪八条一定要改的配置呢!我没列快捷键,是因为IDEA原生的快捷键,我用的也挺顺手,所以并不是认为一定要改! 自动编译开关 忽略大小写开关 智能导包开关 悬浮提示开关 取消单行显示tabs的操作 项目文件编码 滚轴修改字体大小 设置行号显示 正文 自动编译开关 在Eclipse中自动编译开关是开着的,如下所示 那么,在IDEA中,务必要手动将其打开,非常重要!如下所示 忽略大小写开关 IDEA默认是匹配大小写,此开关如果未关。你输入字符一定要符合大小写。比如你敲string是不会出现代码提示或智能补充。 但是,如果你开了这个开关,你无论输入String或者string都会出现代码提示或者智能补充! 智能导包开关 如下图所示,将 自动导入不明确的结构 智能优化包 这两个选项勾上。那么有什么效果呢? 你在代码中,只要敲list,就会出现提示,自动导入java.util.List这个类。而这...
-
下一篇
修复网站漏洞对phpmyadmin防止被入侵提权的解决办法
phpmyadmin是很多网站用来管理数据库的一个系统,尤其是mysql数据库管理的较多一些,最近phpmysql爆出漏洞,尤其是弱口令,sql注入漏洞,都会导致mysql的数据账号密码被泄露,那么如何通过phpmyadmin来上传提权webshell呢 首先我们来搭建一下PHP+mysql环境,linux centos系统,PHP的版本是5.3,mysql版本是5.6,linux系统64位,apache 2.2版本,部署在新开的一台阿里云的按量付费ECS服务器。 phpmyadmin漏洞利用 利用mysql数据库select into outfile方式来写入webshell到网站的根目录下,该漏洞的利用前提是必须知道网站的当前路径是多少,如何知道网站的当前路径,这个要通过爆出网站的错误来进行查看绝对的路径。使用下面的代码: select load_file('/home/www/safe.php') select '<?php eval($_POST[sine]); ?>' into outfile '/home/www/safe.php'; 执行这个语句就可以生成一句...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- Dcoker安装(在线仓库),最新的服务器搭配容器使用
- SpringBoot2编写第一个Controller,响应你的http请求并返回结果
- CentOS关闭SELinux安全模块
- Windows10,CentOS7,CentOS8安装Nodejs环境
- MySQL8.0.19开启GTID主从同步CentOS8
- CentOS7,8上快速安装Gitea,搭建Git服务器
- CentOS8编译安装MySQL8.0.19
- Springboot2将连接池hikari替换为druid,体验最强大的数据库连接池
- MySQL数据库在高并发下的优化方案
- Docker使用Oracle官方镜像安装(12C,18C,19C)