Thread的基本方法-yield方法的分析与实例说明

Posted teayear

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Thread的基本方法-yield方法的分析与实例说明相关的知识,希望对你有一定的参考价值。

package day32;
class ThreadYield implements Runnable
    @Override
    public void run() 
        for (int i = 0; i < 5; i++) 
            if(i==3)
                System.out.println(Thread.currentThread().getName()+"礼让练车给其他伙伴!");
                Thread.yield();
            
            System.out.println(Thread.currentThread().getName()+"练车圈数:"+(i+1));
        
    

public class Demo01 
    public static void main(String[] args) 
        ThreadYield ty=new ThreadYield();
        Thread t1=new Thread(ty,"VIP会员");
        Thread t2=new Thread(ty,"银牌会员");
        Thread t3=new Thread(ty,"铁牌会员");

        t1.setPriority(Thread.MAX_PRIORITY);  //10级别;
        t2.setPriority(Thread.NORM_PRIORITY); //5
        t3.setPriority(Thread.MIN_PRIORITY);  //1

        t1.start();t2.start();t3.start();
    

本章主要对JavaThread类的基本方法进行学习。

1.序言
Thread类作为线程的基类,提供了一系列方法,主要有:

Thread.sleep(long):强制线程睡眠一段时间。
Thread.activeCount():获取当前程序中存活的线程数。
thread.start():启动一个线程。
Thread.currentThread():获取当前正在运行的线程。
thread.getThreadGroup():获取线程所在线程组。
thread.getName():获取线程的名字。
thread.getPriority():获取线程的优先级。
thread.setName(name):设置线程的名字。
thread.setPriority(priority):设置线程的优先级。
thread.isAlive():判断线程是否还存活着。
thread.isDaemon():判断线程是否是守护线程。
thread.setDaemon(true):将指定线程设置为守护线程。
thread.join():在当前线程中加入指定线程,使得这个指定线程等待当前线程,并在当前线程结束前结束。
thread.yield():使得当前线程退让出CPU资源,把CPU调度机会分配给同样线程优先级的线程。
thread.interrupt():使得指定线程中断阻塞状态,并将阻塞标志位置为true。
object.wai()、object.notify()、object.notifyAll()Object类提供的线程等待和线程唤醒方法。

总结

t.yield():线程t提示资源调度器,线程t愿意放弃其当前使用的处理资源。
资源调度器可以忽略这个提示。
当资源调度器忽略这个退让提示时,线程还是按照原来的调度进行。
yield()方法适用于同等优先级级别的线程之间。
yield()方法如果成功,则线程从Running(运行)状态切换至Runnable(就绪)状态
举例说明:

程序中有两个线程:[线程A] = threadA、[线程B]=threadB,他们的优先级一样,都是默认的5。
在[线程A]的run()方法中,调用了Thread.yield(),提示CPU,愿意让出CPU资源,让其他同等优先级基本的线程进行运行。
可能的结果之一:CPU因为某种原因忽略了这个提示,则[线程A]继续运行。
可能的结果之二:CPU认可了这个提示,并调度[线程B]来执行线程代码。
关于join()方法更形象的说法:线程退让。

3.实例代码与结果
3.1.示例场景
这是一个学员学习开车的场景。
共有四个学员,他们拥有不同的会员级别:金卡会员DDD、银卡会员AAA、银卡会员BBB和铜卡会员CCC。
他们四个学员共用一台教练车进行学车练习。
由于金卡会员的优先级最高,每天学车时,DDD都是最先完成教练车的使用。
金卡会员DDD在练习过程中,也想把学车机会让给其他学员。但教练不同意,因为这不符合驾校规定:优先级高的会员先练车。
银卡会员AAA和BBB在练习的过程中,可以相互礼让练车机会。
铜卡会员CCC,只能等其他学员都完成练习之后才能够进行练车。
3.2.代码实现
分析:线程之间的退让需要用yield()方法实现,这种退让只能发生在同样优先级级别的线程之间。
3.3.运行结果
由于线程退让时,CPU的具体情况多种多样,所以线程退让有两种结果:退让被忽略、退让成功。下面分别给出两种情况的执行结果。
yield(退让)被忽略:结论:退让被忽略时,各线程还是各行其道。结论:

退让成功时,退让线程会由Running(运行)转为Runnable(就绪)状态。
退让了的线程,与其他同优先级级别的线程一样,同样有再次获取CPU使用权的机会。

以上是关于Thread的基本方法-yield方法的分析与实例说明的主要内容,如果未能解决你的问题,请参考以下文章

Thread的基本方法-yield方法的分析与实例说明

Thread 中yield(), join()

多线程操作的方法(sleep,)setPriority(Thread.MIN_PRIORITY);yield();

线程相关的sleep()yield()wait()join()方法介绍

Java中Wait,Sleep和Yield方法的区别

Thread.yield()方法