java 线程协作 yield()详解编程语言
2023-06-13 09:20:47 时间
yield():方法的定义
调用yield方法会让当前线程交出CPU权限,让CPU去执行其他的线程。 但是yield不能控制具体的交出CPU的时间,另外,yield方法只能让拥有相同优先级的线程有获取CPU执行时间的机会 (Yield告诉当前正在执行的线程把运行机会交给线程池中拥有相同优先级的线程, cpu会从众多的可执行态里选择.),优先级高的线程业不一定会获得执行权,他们只是概率上大些。该方法不会释放锁。
注意:调用yield方法并不会让线程进入阻塞状态,而是让线程重回就绪状态,它只需要等待重新获取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 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 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 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 i++){ if(i==3){ Thread.yield(); System.out.println(Thread.currentThread().getName()+"执行==》"+i); } catch (Exception e) { e.printStackTrace(); }
执行结果:无论如何重复执行,一个线程只能等另一个线程执行完后才能执行。
原创文章,作者:ItWorker,如若转载,请注明出处:https://blog.ytso.com/16319.html
cjava相关文章
- java h2数据库_JAVA 项目中使用 H2 数据库
- java线程池的面试题_献给准备面试的你,Java线程and线程池面试题小结「建议收藏」
- java线程池参数详解
- java笛卡尔积算法_Java 笛卡尔积算法的简单实现
- Java的定时器_JAVA定时任务
- java实现定时器的四种方式_java定时器实现文字内容交换
- 【JAVA面试必会】JMM高并发详解(java内存模型、JMM三大特征、volatile关键字 )「建议收藏」
- 【Java 集合】Java 集合的线程安全性 ( 加锁同步 | java.utils 集合 | 集合属性 | java.util.concurrent 集合 | CopyOnWrite 机制 )
- 【错误记录】Android Studio 4.2.1 编译报错 ( 设置支持的 Java 和 Kotlin 版本 | java.lang.BootstrapMethodError )
- Java ConcurrentLinkedQueue队列线程安全操作详解编程语言
- Java 线程 Executor 框架详解与使用编程语言
- java压缩与解压(Java.util.zip)详解编程语言
- 打印当前java程序的线程堆栈详解编程语言
- java基础学习总结——线程(二)详解编程语言
- Java学习笔记之七java函数的语法规则总结详解编程语言
- Java学习笔记之二java标识符命名规范详解编程语言
- java线程间通信详解编程语言
- Java 多线程详解(三)——线程的同步编程语言
- Java线程池实现原理详解编程语言
- java 线程池——异步任务详解编程语言
- 深入Java:利用API快速创建MySQL表(java创建mysql表)
- Java并发编程:线程池的使用详解编程语言
- Java多线程(六):线程让步详解编程语言
- Java ThreadPoolExecutor线程池原理详解编程语言
- Java 线程池理解详解编程语言
- java 线程池 spring线程池 多线程知识总结详解编程语言
- 使用Java设置Redis密码(redis密码java)
- 让Java桥接Linux新世界的重要性(java链接linux)
- 管理Linux下Java版本管理:轻松实现多版本切换(linux下java版本)
- Oracle收购了Java一个伟大的转折点(java被oracle吗)
- Java代码构建一个线程池