java 线程协作 yield()
yield():方法的定义
调用yield方法会让当前线程交出CPU权限,让CPU去执行其他的线程。 但是yield不能控制具体的交出CPU的时间,另外,yield方法只能让拥有相同优先级的线程有获取CPU执行时间的机会 (Yield告诉当前正在执行的线程把运行机会交给线程池中拥有相同优先级的线程, cpu会从众多的可执行态里选择.),优先级高的线程业不一定会获得执行权,他们只是概率上大些。该方法不会释放锁。
注意:调用yield方法并不会让线程进入阻塞状态,而是让线程重回就绪状态,它只需要等待重新获取CPU执行时间(也就是说,当前也就是刚刚的那个线程还是有可能会被再次执行到的,
并不是说一定会执行其他线程而该线程在下一次中不会执行到了)。
示例:交出当前cpu的执行权,与其他线程一起重新获取cpu的调度
public class ThreadYieldTest {
static Object object=new Object();
public static void main(String[] args) {
Thread thread_a=new Thread(new Thread_a());
Thread thread_b=new Thread(new Thread_b());
thread_a.setPriority(Thread.MIN_PRIORITY); //Min Priority
thread_b.setPriority(Thread.MAX_PRIORITY); //Max Priority
thread_a.start();
thread_b.start();
}
}
class Thread_a implements Runnable{
@Override
public void run() {
try {
for(int i=0;i<5;i++){
//当i为3时,该线程就会把CPU时间让掉,让其他或者自己的线程执行(也就是谁先抢到谁执行)
if(i==3){
Thread.yield();
}
System.out.println(Thread.currentThread().getName()+"执行==》"+i);
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
class Thread_b implements Runnable{
@Override
public void run() {
try {
for(int i=0;i<5;i++){
if(i==3){
Thread.yield();
}
System.out.println(Thread.currentThread().getName()+"执行==》"+i);
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
运行结果:
第一种情况:Thread-0 当执行到3时会CPU时间让掉,这时Thread-1抢到CPU时间并执行。

第二种情况:Thread-0 当执行到3时会CPU时间让掉,这时Thread-0抢到CPU时间并执行。

示例:它跟sleep方法类似,同样不会释放锁。
public class ThreadYieldTest {
static Object object=new Object();
public static void main(String[] args) {
Thread thread_a=new Thread(new Thread_a());
Thread thread_b=new Thread(new Thread_b());
thread_a.setPriority(Thread.MIN_PRIORITY); //Min Priority
thread_b.setPriority(Thread.MAX_PRIORITY); //Max Priority
thread_a.start();
thread_b.start();
}
}
class Thread_a implements Runnable{
@Override
public void run() {
try {
synchronized (ThreadYieldTest.object) {
System.out.println("进入线程"+Thread.currentThread().getName());
for(int i=0;i<5;i++){
//当i为3时,该线程就会把CPU时间让掉,让其他或者自己的线程执行(也就是谁先抢到谁执行)
if(i==3){
Thread.yield();
}
System.out.println(Thread.currentThread().getName()+"执行==》"+i);
}
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
class Thread_b implements Runnable{
@Override
public void run() {
try {
synchronized (ThreadYieldTest.object) {
System.out.println("进入线程"+Thread.currentThread().getName());
for(int i=0;i<5;i++){
if(i==3){
Thread.yield();
}
System.out.println(Thread.currentThread().getName()+"执行==》"+i);
}
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
执行结果:无论如何重复执行,一个线程只能等另一个线程执行完后才能执行。

java 线程协作 yield()的更多相关文章
- Java线程中yield与join方法的区别
长期以来,多线程问题颇为受到面试官的青睐.虽然我个人认为我们当中很少有人能真正获得机会开发复杂的多线程应用(在过去的七年中,我得到了一个机会),但是理解多线程对增加你的信心很有用.之前,我讨论了一个w ...
- java 线程协作 wait(等待)与 notiy(通知)
一.wait().notify()和notifyAll() 为了更好的支持多线程之间的协作,JDK提供了三个重要的本地方法 //调用某个对象的wait()方法能让当前线程阻塞,并且当前线程必须拥有此对 ...
- java线程中yield(),sleep(),wait()区别详解
1.sleep() 使当前线程(即调用该方法的线程)暂停执行一段时间,让其他线程有机会继续执行,但它并不释放对象锁.也就是说如果有synchronized同步快,其他线程仍然不能访问共享数据.注意该方 ...
- Java线程中yield()的用法
Thread.yield()方法的作用:暂停当前正在执行的线程,并执行其他线程.(可能没有效果) yield()让当前正在运行的线程回到可运行状态,以允许具有相同优先级的其他线程获得运行的机会.因此, ...
- java 线程协作 join()
在实际开发中我们往往会遇到这样的情况一个线程的执行需要依赖另一个线程执行后的结果.即主线程生成并起动了子线程,如果子线程里要进行大量的耗时的运算,主线程往往将于子线程之前结束,但是如果主线程处理完其他 ...
- 【Java并发专题之三】Java线程互斥、协作原理
(I)Java线程互斥原理之synchronized原理 从JDK5引入CAS原子操作,但没有对synchronized关键字做优化,而是增加了J.U.C.concurrent,concurrent包 ...
- Java线程小刀牛试
线程简介 什么是线程 现代操作系统调度的最小单元是线程,也叫轻量级进程(Light Weight Process),在一个进程里可以创建多个线程,这些线程都拥有各自的计数器.堆栈和局部变量等属性,并且 ...
- Java线程基础知识(状态、共享与协作)
1.基础概念 CPU核心数和线程数的关系 核心数:线程数=1:1 ;使用了超线程技术后---> 1:2 CPU时间片轮转机制 又称RR调度,会导致上下文切换 什么是进程和线程 进程:程序运行资源 ...
- JAVA 线程状态以及synchronized,wait,sleep,yield,notify,notifyAll
java线程存在以下几种状态: 1: 创建状态(New):线程被new出来,还未调用start 2: 就绪状态(Runnable):又称为可执行状态,调用线程的start方法后,线程处于就绪状态,,线 ...
随机推荐
- angular js 的 ng-keyup 监听 keydown keyup事件获取 keyCode
参考这个页面.http://www.angularjshub.com/examples/eventhandlers/keyboardevents/ Html页面代码: <input ng-mod ...
- 【转载】Adapter用法总结大全
下面的是看到的比较好的地址: Android各种Adapter的用法: http://my.oschina.net/u/658933/blog/372151 Andro ...
- Node.js ORM 框架 sequelize 实践
最近在做团队的一个内部系统,这次使用的nodejs web框架是团队统一的hapi.js,而数据库依然是mysql,ORM 框架选用有着6000+ stars 的 sequelize.js,hapi- ...
- vijos1910解方程
描述 已知多项式方程: a0+a1x+a2x2+...+anxn=0a0+a1x+a2x2+...+anxn=0 求这个方程在[1, m]内的整数解(n 和 m 均为正整数). 格式 输入格式 输 ...
- 51单片机对无线模块nRF24L01简单的控制收发程序
它的一些物理特性如工作频段.供电电压.数据传输速率就不详细介绍了,直接上代码. 1.首先是发送端: // Define SPI pins #include <reg51.h> #defin ...
- (期望)A Dangerous Maze(Light OJ 1027)
http://www.lightoj.com/volume_showproblem.php?problem=1027 You are in a maze; seeing n doors in fron ...
- 用ADMM求解大型机器学习问题
[本文链接:http://www.cnblogs.com/breezedeus/p/3496819.html,转载请注明出处] 从等式约束的最小化问题说起: ...
- hdu 5718(Oracle)大数加法
曾经有一位国王,统治着一片未名之地.他膝下有三个女儿. 三个女儿中最年轻漂亮的当属Psyche.她的父亲不确定她未来的命运,于是他来到Delphi神庙求神谕. 神谕可以看作一个不含前导零的正整数n n ...
- 5.webService拦截器
CXF为什么要设计拦截器? 为了在webservice请求过程中,能动态操作请求和响应数据, CXF设计了拦截器. 拦截器分类 1.按所处的位置分:服务器端拦截器,客户端拦截器 2.按消息的方向分:入 ...
- libj 0.8.2 发布,Java/JavaScript API 的 C++ 实现
libj 0.8.2 增加了一些新的字符串相关的方法. libj 是一个跨平台的运行库,相当于提供了类似 Java/JavaScript API.libj 的内存管理是自动的,基于 shared_pt ...