Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/364.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java yield()方法未按预期工作_Java_Multithreading - Fatal编程技术网

Java yield()方法未按预期工作

Java yield()方法未按预期工作,java,multithreading,Java,Multithreading,java.lang.Thread.yield()方法使当前正在执行的Thread对象暂时暂停,并允许其他线程执行 注意:其他线程也可以是同一线程。JVM不能保证选择哪个线程。阅读本文。屈服方法是请求线程休眠。这可能会发生,也可能不会发生。与多线程的几乎所有方面一样,即使您的案例也不能保证按预期的方式运行Thread.yield()就像是给操作系统的一个建议——如果可能的话,请在这个线程之前执行其他线程。根据系统的体系结构(内核数量和其他方面,如亲和性等),操作系统可能会忽略您的请求 此外,在JD

java.lang.Thread.yield()方法使当前正在执行的Thread对象暂时暂停,并允许其他线程执行


注意:其他线程也可以是同一线程。JVM不能保证选择哪个线程。

阅读本文。屈服方法是请求线程休眠。这可能会发生,也可能不会发生。

与多线程的几乎所有方面一样,即使您的案例也不能保证按预期的方式运行
Thread.yield()
就像是给操作系统的一个建议——如果可能的话,请在这个线程之前执行其他线程。根据系统的体系结构(内核数量和其他方面,如亲和性等),操作系统可能会忽略您的请求

此外,在JDK6U23之后,JVM可能会将代码更改为:

0Thread[Thread-1,5,main] 
1Thread[Thread-1,5,main] 
2Thread[Thread-1,5,main] 
4Thread[Thread-1,5,main] 
5Thread[Thread-1,5,main] 
0Thread[Thread-0,5,main] 
1Thread[Thread-0,5,main] 
2Thread[Thread-0,5,main] 
4Thread[Thread-0,5,main] 
5Thread[Thread-0,5,main] 
public void run(){

对于(int i=0;输出:0线程[Thread-1,5,main]1线程[Thread-1,5,main]2线程[Thread-1,5,main]4线程[Thread-1,5,main]5线程[Thread-1,5,main]0线程[Thread-0,5,main]1线程[Thread-0,5,main]2线程[Thread-0,5,main]4线程[Thread-0,5,main]5线程[Thread-0,5,main]5线程[Thread-0,5,main]如果您增加循环迭代次数?它有相同的行为?是的。我尝试使用50100。每次,只跳过if条件满足的迭代,同一个线程继续执行,直到循环结束。然后下一个线程开始执行。如果是这样,如果我增加循环计数器到100,线程将运行很长时间r时间。根据您的声明,我们无法保证选择哪个线程。因此,输出必须是不可预测的。但在这种情况下,每次输出都保持不变。这怎么可能?还要注意,第一个线程可能在第二个线程启动之前完成。顺便说一句,在我的机器上,程序的工作方式与您的相同expecting,在yield语句处更改线程。@GustavGrusell,两个线程同时启动,并且没有同步任何部分代码。如果for循环执行更长时间(假设它们可以同时执行,但它们不能保证同时执行。我的观点是,它们不是在同一时间启动的,而是一个接一个地启动的,第一个可能在第二个启动之前完成。据我所知,您发布的代码不会产生与原始代码相同的结果,因为它会产生输出同样对于i==3。@GustavGrusell-我说过,对于多线程,没有什么是可以预测的。因为yield()与wait()/notify()不同;获取/释放对象监视器上的锁。我想我同意你想说的,我也同意你原来的帖子。我只是想指出你在代码示例中犯了一个小错误。JVM不会以产生额外输出行的方式更改代码。@GustavGrusell-ya..可能。现在,当我仔细观察时,条件本身似乎是有缺陷的。如果(I为3),那么我就没有什么意义了。
0Thread[Thread-1,5,main] 
1Thread[Thread-1,5,main] 
2Thread[Thread-1,5,main] 
4Thread[Thread-1,5,main] 
5Thread[Thread-1,5,main] 
0Thread[Thread-0,5,main] 
1Thread[Thread-0,5,main] 
2Thread[Thread-0,5,main] 
4Thread[Thread-0,5,main] 
5Thread[Thread-0,5,main] 
   public void run() {
      for(int i=0;i<=5;i++) {
   // 3 is too darn small. and yield() is not necessary
   // so let me just iterate 6 times now to improve performance.  
     System.out.println(i+Thread.currentThread().toString());

   }