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. jackson json转list

    今天项目中用到了jackson,经理说效率高一些,所以就开始用起来,一开始json转对象,对象转json还是很简单的,但也还是有一些问题,后来加了一点配置属性就没有报错了 ObjectMapper m ...

  2. 原生态jdbc的应用技术

    为了更好的了解jdbc,最近查阅了前期学习的资料,整理归纳了一下,整理出来了一套jdbc常用的工具类.之所以在这里撰文,一来可以和大家共享技术的魅力,二来可以方便以后的查阅方便.以下是一个jdbc的优 ...

  3. 多清楚的IO 表

  4. Debian 7 安装 wireshark

    安装过程很简单: $ sudo apt-get install wireshark 其中会弹出一个对话框: ┌─────────────────────┤ Configuring wireshark- ...

  5. NSDate

    NSDate : NSDate *date = [NSDate date];获取当前日期 NSDate 可以进行比较,通过earlierDate:方法获取二个日期中最早的. NSDate 通过late ...

  6. js基础知识:表达式

    一.什么是表达式?我理解的"表达式":程序执行到1个"表达式"时,会返回1个值到这个"表达式"所在的位置. var a = 10 , b = ...

  7. C++ REST SDK in Visual Studio 2013

    The C++ REST project provides a modern asynchronous C++ API for cloud-based client-server communicat ...

  8. Focus, w/o disturbance

    Focus = Aim + Execution + Persistence Disturbance = Disappointment + Anxiety + Failure

  9. MyRocks简介

    RocksDB是facebook基于LevelDB实现的,目前为facebook内部大量业务提供服务.经过facebook大量工作,将RocksDB为MySQL的一个存储引擎移植到MySQL,称之为M ...

  10. anyncTask的3个参数

    AnyncTask异步处理数据并将数据应用到视图的操作场合 一  其中包含这几个方法 1 onPreExcute() 初始化控件,例如进度条2 doInBackground() 具体的执行动作请求数据 ...