如何在Java中正确使用Thread.yield()方法

时间:2015-02-21 23:34:47

标签: java multithreading yield

我有一个类,每次循环迭代10次时都会使用yield。我在Java API中读到,使用yield可能需要进行详细的分析和基准测试,以确保它实际上具有所需的效果"。我想知道我的yield实现是否正确,或者如果多个其中一个线程正在运行,我的yield实现是否会产生任何影响。这是代码:

public class FindIt extends Thread{

  private int num;
  private int begin;
  private int end;

/**
 * Class constructor.
 * @param num
 * @param begin
 * @param end
 */
  FindIt(int num, int begin, int end){
    this.num = num;
    this.begin = begin;
    this.end = end;
  }

/**
 * This search method searches within the threads given interval for a number.
 */
  public void search(){
    for(int i = this.begin; i <= this.end; i++){
      if( i % 10 == 0){
        this.yield();

      }
      if (i == this.num){
        System.out.println(num + " was found by thread: "+ this.getName()); 
      }
    }
  }

2 个答案:

答案 0 :(得分:2)

yield方法只是告诉Java线程调度程序当前线程是否愿意休息,从而为其他线程提供一些CPU时间来完成某些工作。据我所知,这种方法在过去有一台CPU运行多线程Java程序的机器时非常有用。由于这种方法的JavaDoc说它很少适合使用这种方法(至少截至今天)。不确定,但也许你只是误解了这种方法背后的功能。

另见Preemption / Time Slicing这些有些相关的概念。

答案 1 :(得分:0)

Thread.yield是调度程序的提示,因此它可能无法执行您想要的操作。我可能会考虑使用Object.wait(0,1)而不是等待最短的时间