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

简介: Thread的基本方法(3)-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();
    }
}
本章主要对Java中Thread类的基本方法进行学习。
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使用权的机会。


目录
相关文章
|
2月前
|
存储 Java 程序员
优化Java多线程应用:是创建Thread对象直接调用start()方法?还是用个变量调用?
这篇文章探讨了Java中两种创建和启动线程的方法,并分析了它们的区别。作者建议直接调用 `Thread` 对象的 `start()` 方法,而非保持强引用,以避免内存泄漏、简化线程生命周期管理,并减少不必要的线程控制。文章详细解释了这种方法在使用 `ThreadLocal` 时的优势,并提供了代码示例。作者洛小豆,文章来源于稀土掘金。
|
3月前
|
算法 Java 调度
深入理解 Thread 类的 Yield 方法
【8月更文挑战第22天】
129 4
|
前端开发 Java 程序员
多线程的创建,复习匿名内部类,Thread的一些方法,以及lambda的变量捕捉,join用法(一)
多线程的创建,复习匿名内部类,Thread的一些方法,以及lambda的变量捕捉,join用法
|
程序员 调度
多线程的创建,复习匿名内部类,Thread的一些方法,以及lambda的变量捕捉,join用法(二)
多线程的创建,复习匿名内部类,Thread的一些方法,以及lambda的变量捕捉,join用法
|
Java API Go
线程介绍,线程与进程区别,如何使用多线程,Thread类,Runnable接口,补充知识(方法重载,方法重写)
线程介绍,线程与进程区别,如何使用多线程,Thread类,Runnable接口,补充知识(方法重载,方法重写)
|
11月前
|
Java 调度
【多线程】Thread类的基本用法
【多线程】Thread类的基本用法
【多线程】Thread类的基本用法
|
缓存 Java 数据库连接
线程的创建、Lambda函数式接口?Runnable和Callable之间的适配?动态修改线程任务?这里带你图解Java线程池
上面只是提到了对于Thread执行任务的一种动态实现方法,肯定还有其他的。 那么动态实现有什么好处呢? 当我们有很多个任务的时候,我们如果一直使用new,再让gc的话,那么对于系统资源的消耗无疑是巨大的。 那么这个时候,如果我们固定一下,专门拿几个线程来处理并发任务呢?但是当并发任务很多又该怎么办? 这个时候就引入了池化思想 —— Pool 什么是池? 在学JDBC的时候我们知道了连接池,在学Spring的时候,我们又接触到了对象池。 其实按理来说线程池应该是大家在初学JavaSE的时候应该就遇到的,这里我们再来讲一下。 线程池,就是用一个容器来管理线程,这个容器叫做池(Poo
113 0
线程的创建、Lambda函数式接口?Runnable和Callable之间的适配?动态修改线程任务?这里带你图解Java线程池
|
调度
Thread 类的基本方法
Thread 类的基本方法
86 0
测试Thread中的常用方法
测试Thread中的常用方法
69 0
|
程序员 调度
多线程之Thread 类的基本用法
多线程之Thread 类的基本用法