Java线程让步yield用法实例分析

本文实例讲述了Java线程让步yield用法。分享给大家供大家参考,具体如下:

一 点睛

yield()方法是一个和sleep()方法有点类似的方法,它是Thread类提供的一个静态方法,它也可以让当前正在执行的线程暂停,但它不会阻塞该线程,它只是让线程转入就绪状态。yield只是让当前线程暂停一下,让系统的线程调度器重新调度一次,完全可能的情况是:当某个线程调用了yield()方法后,线程调度器又将其调度出来重新执行。

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

二 代码

public class YieldTest extends Thread
{
   public YieldTest(String name)
   {
      super(name);
   }
   // 定义run方法作为线程执行体
   public void run()
   {
      for (int i = 0; i < 50 ; i++ )
      {
        System.out.println(getName() + " " + i);
        // 当i等于20时,使用yield方法让当前线程让步
        if (i == 20)
        {
           Thread.yield();
        }
      }
   }
   public static void main(String[] args)throws Exception
   {
      // 启动两条并发线程
      YieldTest yt1 = new YieldTest("高级");
      // 将ty1线程设置成最高优先级
      //yt1.setPriority(Thread.MAX_PRIORITY);
      yt1.start();
      YieldTest yt2 = new YieldTest("低级");
      // 将yt2线程设置成最低优先级
      //yt2.setPriority(Thread.MIN_PRIORITY);
      yt2.start();
   }
}

三 运行

......
低级  18
低级  19
高级  15
低级  20
高级  16
高级  17
高级  18
高级  19
低级  21
高级  20
低级  22
低级  23
低级  24
低级  25
低级  26
...

四 说明

1 此时高级和低级两个线程优先级一样。

2 线程调用yield之后将执行机会让给优先级相同的其他线程。

五 代码2

public class YieldTest extends Thread
{
   public YieldTest(String name)
   {
      super(name);
   }
   // 定义run方法作为线程执行体
   public void run()
   {
      for (int i = 0; i < 50 ; i++ )
      {
        System.out.println(getName() + " " + i);
        // 当i等于20时,使用yield方法让当前线程让步
        if (i == 20)
        {
           Thread.yield();
        }
      }
   }
   public static void main(String[] args)throws Exception
   {
      // 启动两条并发线程
      YieldTest yt1 = new YieldTest("高级");
      // 将ty1线程设置成最高优先级
      yt1.setPriority(Thread.MAX_PRIORITY);
      yt1.start();
      YieldTest yt2 = new YieldTest("低级");
      // 将yt2线程设置成最低优先级
      yt2.setPriority(Thread.MIN_PRIORITY);
      yt2.start();
   }
}

六 运行2

高级  17
高级  18
高级  19
高级  20
高级  21
高级  22
高级  23
高级  24
高级  25
高级  26
高级  27
高级  28
......
高级  48
高级  49
低级  12
低级  13
低级  14
低级  15
低级  16
低级  17
低级  18
低级  19
低级  20
低级  21
低级  22
低级  23

七 说明2

1 两个线程的优先级不同。

2 高优先级的线程调用yield方法暂停之后,系统没有与之优先级相同,或更高优先级的线程,所以该线程继续执行。

更多java相关内容感兴趣的读者可查看本站专题:《Java进程与线程操作技巧总结》、《Java数据结构与算法教程》、《Java操作DOM节点技巧总结》、《Java文件与目录操作技巧汇总》和《Java缓存操作技巧汇总》

希望本文所述对大家java程序设计有所帮助。

(0)

相关推荐

  • Java线程关闭的3种方法

    Java线程关闭,总的来说有3种: 1.使用状态位,这个简单,就不多说了: 复制代码 代码如下: public class Task extends Thread { private volatile boolean flag= true; public void stopTask() { flag = false; } @Override public void run() { while(flag){ /* do your no-block task */ } } } 2.当线程等待某些事件

  • java线程之使用Runnable接口创建线程的方法

    实现Runnable接口的类必须使用Thread类的实例才能创建线程.通过Runnable接口创建线程分为两步: 1. 将实现Runnable接口的类实例化. 2. 建立一个Thread对象,并将第一步实例化后的对象作为参数传入Thread类的构造方法. 最后通过Thread类的start方法建立线程. 下面的代码演示了如何使用Runnable接口来创建线程: 复制代码 代码如下: package mythread; public class MyRunnable implements Runn

  • Java多线程yield心得分享

    一. Thread.yield( )方法: 使当前线程从执行状态(运行状态)变为可执行态(就绪状态).cpu会从众多的可执行态里选择,也就是说,当前也就是刚刚的那个线程还是有可能会被再次执行到的,并不是说一定会执行其他线程而该线程在下一次中不会执行到了. Java线程中有一个Thread.yield( )方法,很多人翻译成线程让步.顾名思义,就是说当一个线程使用了这个方法之后,它就会把自己CPU执行的时间让掉,让自己或者其它的线程运行. 打个比方:现在有很多人在排队上厕所,好不容易轮到这个人上厕

  • 详解Java中的线程让步yield()与线程休眠sleep()方法

    线程让步: yield() yield()的作用是让步.它能让当前线程由"运行状态"进入到"就绪状态",从而让其它具有相同优先级的等待线程获取执行权:但是,并不能保证在当前线程调用yield()之后,其它具有相同优先级的线程就一定能获得执行权:也有可能是当前线程又进入到"运行状态"继续运行! 示例: class ThreadA extends Thread{ public ThreadA(String name){ super(name); }

  • Java中join线程操作实例分析

    本文实例讲述了Java中join线程操作.分享给大家供大家参考,具体如下: 一 点睛 Tread提供了让一个线程等待另外一个线程完成的方法--join()方法.当在某个程序执行流中调用其他线程的join()方法时,调用线程将被阻塞,直到被join()方法加入的join线程执行完后为止. join()方法通常由使用线程的程序调用,以将大问题划分成许多小问题,每个小问题分配一个线程.当所有小问题都得到处理后,再调用主线程来进一步操作. 二 代码 public class JoinThread ext

  • Java线程中sleep和wait的区别详细介绍

    Java中的多线程是一种抢占式的机制,而不是分时机制.抢占式的机制是有多个线程处于可运行状态,但是只有一个线程在运行. 共同点: 1. 他们都是在多线程的环境下,都可以在程序的调用处阻塞指定的毫秒数,并返回. 2. wait()和sleep()都可以通过interrupt()方法 打断线程的暂停状态 ,从而使线程立刻抛出InterruptedException. 如果线程A希望立即结束线程B,则可以对线程B对应的Thread实例调用interrupt方法.如果此刻线程B正在wait/sleep/

  • Java多线程实现异步调用的方法

    在JAVA平台,实现异步调用的角色有如下三个角色:调用者 提货单   真实数据 一个调用者在调用耗时操作,不能立即返回数据时,先返回一个提货单.然后在过一断时间后凭提货单来获取真正的数据. 去蛋糕店买蛋糕,不需要等蛋糕做出来(假设现做要很长时间),只需要领个提货单就可以了(去干别的事情),等到蛋糕做好了,再拿提货单取蛋糕就可以了. public class Main { public static void main(String[] args) { System.out.println("ma

  • Java线程让步_动力节点Java学院整理

    yield()介绍 yield()的作用是让步.它能让当前线程由"运行状态"进入到"就绪状态",从而让其它具有相同优先级的等待线程获取执行权:但是,并不能保证在当前线程调用yield()之后,其它具有相同优先级的线程就一定能获得执行权:也有可能是当前线程又进入到"运行状态"继续运行! yield()示例 下面,通过示例查看它的用法. // YieldTest.java的源码 class ThreadA extends Thread{ public

  • java基本教程之java线程等待与java唤醒线程 java多线程教程

    本章,会对线程等待/唤醒方法进行介绍.涉及到的内容包括:1. wait(), notify(), notifyAll()等方法介绍2. wait()和notify()3. wait(long timeout)和notify()4. wait() 和 notifyAll()5. 为什么notify(), wait()等函数定义在Object中,而不是Thread中 wait(), notify(), notifyAll()等方法介绍在Object.java中,定义了wait(), notify()

  • Java后台线程操作示例【守护线程】

    本文实例讲述了Java后台线程操作.分享给大家供大家参考,具体如下: 一 点睛 有一种线程,它是后面运行的,它的任务是为其他线程提供服务,这种线程被称为"后台"线程,又称为"守护线程"或"精灵线程".JVM的垃圾回收线程就是典型的后台线程. 后台线程有个特征:如果所有的前台线程都死亡,后台线程会自动死亡, 调用Thread对象的setDaemon(true)方法可将指定线程设置成后台线程,所有的前台线程都死亡时,后台线程随之死亡.当整个虚拟机中只

  • Java多线程的用法详解

    1.创建线程 在Java中创建线程有两种方法:使用Thread类和使用Runnable接口.在使用Runnable接口时需要建立一个Thread实例.因此,无论是通过Thread类还是Runnable接口建立线程,都必须建立Thread类或它的子类的实例.Thread构造函数: public Thread( );  public Thread(Runnable target);  public Thread(String name);  public Thread(Runnable target

  • java基本教程之线程让步 java多线程教程

    本章涉及到的内容包括:1. yield()介绍2. yield()示例3. yield() 与 wait()的比较 1. yield()介绍yield()的作用是让步.它能让当前线程由"运行状态"进入到"就绪状态",从而让其它具有相同优先级的等待线程获取执行权:但是,并不能保证在当前线程调用yield()之后,其它具有相同优先级的线程就一定能获得执行权:也有可能是当前线程又进入到"运行状态"继续运行! 2. yield()示例下面,通过示例查看它

随机推荐