我有一个类,每次循环迭代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());
}
}
}
答案 0 :(得分:2)
yield
方法只是告诉Java线程调度程序当前线程是否愿意休息,从而为其他线程提供一些CPU时间来完成某些工作。据我所知,这种方法在过去有一台CPU运行多线程Java程序的机器时非常有用。由于这种方法的JavaDoc说它很少适合使用这种方法(至少截至今天)。不确定,但也许你只是误解了这种方法背后的功能。
另见Preemption / Time Slicing这些有些相关的概念。
答案 1 :(得分:0)
Thread.yield是调度程序的提示,因此它可能无法执行您想要的操作。我可能会考虑使用Object.wait(0,1)而不是等待最短的时间