Thread.yield()的使用; java的

时间:2013-01-12 12:32:04

标签: java yield

任何人都可以解释这段代码:

public class Main implements Runnable{

private int i;
public synchronized void run() {
    System.out.print("i = "+ i +"\n");
    if (i % 5 != 0) {
        i++;
    }
    for (int x = 0; x < 5; x++, i++) {
        if (x > 1) {
            Thread.yield();
        }
    }
}

 public static void main(String[] args) {
    Main n = new Main();
    for (int x = 100; x > 0; --x) {
        new Thread(n).start();
    }
}
}

以及输出如何

i= 0
i= 5
i= 10
i= 15
i= 20
.
.
.
i= 499

3 个答案:

答案 0 :(得分:3)

底部循环创建100个线程。每个线程立即运行,与其他线程并行运行。在每个帖子中,

  • 在开始时,打印共享属性“i”的当前值
  • 如果i不能被5整除,则会增加一次
  • 然后执行循环,最多5次。最后执行3次,它会产生其他线程。每次执行此循环时,它都会增加共享变量“i”

因此,如果可以被5整除,则i增加5次,如果不是5则增加6次。但是,run()方法是同步因此,当其中一个线程已经执行时,不允许执行其他线程:您的程序实际上是单线程的,yield()被忽略(没有其他线程可以执行),并且输出相同到

for (int i=0; i<500; i+= 5) System.out.println(i);
System.out.println(499);

删除synchronized以查看改变输出的各种竞争条件。

答案 1 :(得分:2)

主线程创建100个线程,每个线程执行一个synchronized方法,以便序列化它们的执行。每个线程打印i的当前值(默认情况下在开头为0)并将其递增5次,以便下一个获取cpu(并执行正文)的线程打印新值i

Thread.yield();  放弃CPU,但这并不意味着它释放了锁。这就是为什么每个线程在前一个线程完成后执行run方法而不是其他方法。

答案 2 :(得分:1)

了解yield does not release the monitor非常重要。因此,所有线程都按顺序运行,即yield不允许其他线程运行,因为它位于synchronized块内并且监视器保持锁定状态。