【问题标题】:How to properly use Thread.yield() method in Java [closed]如何在 Java 中正确使用 Thread.yield() 方法 [关闭]
【发布时间】:2015-04-23 12:45:47
【问题描述】:

我有一个类,每次循环迭代 10 次时都会使用 yield。我在 Java API 中读到,使用 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()); 
      }
    }
  }

【问题讨论】:

  • 需要额外的什么
  • “详细的分析和基准测试,以确保它实际上具有预期的效果。”

标签: java multithreading yield


【解决方案1】:

yield 方法只是告诉 Java 线程调度程序当前线程愿意休息一下,从而给其他线程一些 CPU 时间来做一些工作。据我所知,这种方法在过去非常有用,当时有单 CPU 的机器运行多线程 Java 程序。正如这种方法的 JavaDoc 所说,使用这种方法很少合适(至少在今天)。不确定,但也许您只是误解了此方法背后的功能。

另请参阅Preemption / Time Slicing,这是一些相关的概念。

【讨论】:

  • 据我所知,这种方法在过去最有用... ForkJoinPool 到目前为止还没有实现时代 - 它仍然使用Thread::yield
【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-08-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-03-20
    • 2016-09-02
    • 2013-06-27
    相关资源
    最近更新 更多