• 10_控制线程_线程让步yield


    【线程让步yield()方法】

    yield()方法可以让当前正在执行的线程暂停,但它不会阻塞该线程,它只是将该线程从运行状态转入就绪状态

    只是让当前的线程暂停一下,让系统的线程调度器重新调度一次。

    很有可能,当某个线程调用了yield()方法暂停之后进入就绪状态,它又马上抢占了CPU的执行权,继续执行。

    【注意】

    实际上,当某个线程调用了yield()方法暂停之后,只有优先级与当前线程相同,或者优先级比当前线程更高的处于就绪状态的线程才会获得执行的机会。

    【示例代码】

    package com.Higgin.part02;
    
    class YieldThread implements Runnable{
        
        public void run() {
            for(int i=0;i<100;i++){
                
                if(i==20){
                    //当i==20的时候,使用yield方法使当前线程让步
                    Thread.yield();
                }
                System.out.println(Thread.currentThread().getName()+"===="+i);
            }
        };
    }
    
    public class Demo03 {
        public static void main(String[] args) {
            YieldThread yt=new YieldThread();
            Thread t1=new Thread(yt,"高级");
            t1.setPriority(Thread.MAX_PRIORITY);  //将t1线程设置成最高优先级
            
            Thread t2=new Thread(yt,"低级");
            t2.setPriority(Thread.MIN_PRIORITY);  //将t2线程设置成最低优先级
            
            t2.start();
            t1.start();
            
        }
    }

    【运行结果】

    【注意】

    在多CPU执行的情况下,效果可能会不明显。

    【小结:关于sleep和yield的区别】

    1.sleep()方法暂停当前线程后,会给其他线程执行机会,线程优先级对此没有影响。

    yield()方法会给优先级相同或更高的线程更高的执行机会。

    2.sleep()方法会将线程转入阻塞状态,直到阻塞时间结束,才会转入就绪状态。

    yield()方法会将当前线程直接转入就绪状态。

    3.sleep()方法声明抛出了InterruptedException异常,所以调用sleep()方法时要么捕捉该异常,要么显示声明抛出该异常。

    yield()方法则没有声明抛出任何异常。

    4.sleep()方法比yield()方法有更好的移植性,通常不建议使用yield()方法来控制并发线程的执行。

    【设置线程的优先级】

    Thread了提供了以下两个优先级相关方法:

    1.setPriority( int newPriority ) :设置线程的优先级

    2.getPriority( ):获取线程的优先级

    默认情况下,main主线程默认为NORM_PRIORITY普通优先级,其值为5。

  • 相关阅读:
    对模拟器虚假设备识别能力提升15%!每日清理大师App集成系统完整性检测
    教你实现华为快应用深色主题适配
    如何实现一个malloc
    如何提高团队管理能力?
    大型网站架构演变和知识体系
    call_user_func 和 call_user_func_array用法
    源码研究:php变量
    http协议简介
    用c语言实现http请求
    用socket写一个简单的客户端和服务端程序
  • 原文地址:https://www.cnblogs.com/HigginCui/p/5903652.html
Copyright © 2020-2023  润新知