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()的更多相关文章

  1. Java线程中yield与join方法的区别

    长期以来,多线程问题颇为受到面试官的青睐.虽然我个人认为我们当中很少有人能真正获得机会开发复杂的多线程应用(在过去的七年中,我得到了一个机会),但是理解多线程对增加你的信心很有用.之前,我讨论了一个w ...

  2. java 线程协作 wait(等待)与 notiy(通知)

    一.wait().notify()和notifyAll() 为了更好的支持多线程之间的协作,JDK提供了三个重要的本地方法 //调用某个对象的wait()方法能让当前线程阻塞,并且当前线程必须拥有此对 ...

  3. java线程中yield(),sleep(),wait()区别详解

    1.sleep() 使当前线程(即调用该方法的线程)暂停执行一段时间,让其他线程有机会继续执行,但它并不释放对象锁.也就是说如果有synchronized同步快,其他线程仍然不能访问共享数据.注意该方 ...

  4. Java线程中yield()的用法

    Thread.yield()方法的作用:暂停当前正在执行的线程,并执行其他线程.(可能没有效果) yield()让当前正在运行的线程回到可运行状态,以允许具有相同优先级的其他线程获得运行的机会.因此, ...

  5. java 线程协作 join()

    在实际开发中我们往往会遇到这样的情况一个线程的执行需要依赖另一个线程执行后的结果.即主线程生成并起动了子线程,如果子线程里要进行大量的耗时的运算,主线程往往将于子线程之前结束,但是如果主线程处理完其他 ...

  6. 【Java并发专题之三】Java线程互斥、协作原理

    (I)Java线程互斥原理之synchronized原理 从JDK5引入CAS原子操作,但没有对synchronized关键字做优化,而是增加了J.U.C.concurrent,concurrent包 ...

  7. Java线程小刀牛试

    线程简介 什么是线程 现代操作系统调度的最小单元是线程,也叫轻量级进程(Light Weight Process),在一个进程里可以创建多个线程,这些线程都拥有各自的计数器.堆栈和局部变量等属性,并且 ...

  8. Java线程基础知识(状态、共享与协作)

    1.基础概念 CPU核心数和线程数的关系 核心数:线程数=1:1 ;使用了超线程技术后---> 1:2 CPU时间片轮转机制 又称RR调度,会导致上下文切换 什么是进程和线程 进程:程序运行资源 ...

  9. JAVA 线程状态以及synchronized,wait,sleep,yield,notify,notifyAll

    java线程存在以下几种状态: 1: 创建状态(New):线程被new出来,还未调用start 2: 就绪状态(Runnable):又称为可执行状态,调用线程的start方法后,线程处于就绪状态,,线 ...

随机推荐

  1. 【权值线段树】bzoj3224 Tyvj 1728 普通平衡树

    一个板子. #include<cstdio> #include<algorithm> using namespace std; #define N 100001 struct ...

  2. Java学习笔记 01 基本数据类型、标识符、关键字和运算符

    一.基本数据类型 基本数据类型 数据类型 内存空间(8位等于1字节) 取值范围 备注 byte 8位 -128~127   short 16位 -32768~32767   int 32位 -2147 ...

  3. JS无刷新分页插件

    本文介绍一个本人自己写的一JS分页插件 <script src="/Js/smart.page.min.js" type="text/javascript" ...

  4. python学习粘贴

    1. Python通过re模块提供对正则表达式的支持.使用re的一般步骤是先使用re.compile()函数,将正则表达式的字符串形式编译为Pattern实例,然后使用Pattern实例处理文本并获得 ...

  5. 黑马程序员-懒加载 lazy loading

    懒加载:延迟加载,当程序启动时不加载资源,当程序需要这些资源时再去加载.需要的时候再加载的一种方式,能够减少内存的占用,效率高.其本质是重写get方法. 背景:由于ios内存有限,如果我们一次性将所有 ...

  6. Refresh recovery area usage data after manually deleting files under recovery area

    Original source: http://www.dba-oracle.com/t_v$_flash_recovery_area.htm If you manually delete files ...

  7. ubuntu安装日文分词软件MeCab及其Python插件

    1.从官网上下载三个包: http://taku910.github.io/mecab/ mecab-0.996 mecab-0.996.tar.gz mecab-ipadic-2.7.0-20070 ...

  8. HtmlAgilityPack中通过sibling才能得到对应的InnerText和form,option等tag的子节点

    [背景] 之前使用HtmlAgilityPack期间,遇到了2个bug: 1. InnerText没有包含对应字符串(但是用NextSibling.InnerText却可以得到) 对于html: ? ...

  9. [ASE][Daily Scrum]11.28

    昨天基本上已经完成了sprint2的task, 现在剩下一些bug还需要来修正, 然后我正式加入码代码的大军啦~ Shilin Liu  显示聊天框 Zhao Li     搭建聊天服务器 Yimin ...

  10. PDF2

    itex生成PDF文档示例 package dao.other; import java.awt.Color; import java.io.File; import java.io.FileInpu ...