为什么我的Thread.yield()不起作用

时间:2015-07-27 08:42:08

标签: java multithreading yield

代码:

class A extends Thread {
    public void run() {
        Thread.yield();
        System.out.println("Child Thread");
    }
}
public class Human {
    public static void main (String agrs[]) {
        A t1 = new A();
        A t2 = new A();
        A t3= new A();
        A t4= new A();
        A t5= new A();
        t1.start();
        t2.start();
        t3.start();
        t4.start();
        t5.start();
        for(int a=0;a<1000;a++) {
            System.out.println(a);
        }
    }
}

输出:

626
627
628
629
630
a's value 
a's value 
a's value 
631

当我运行程序时,输出因运行而异。即使我使用yield()方法让主线程首先完成它的工作。但现在我仍然得到混合输出。为什么呢?

3 个答案:

答案 0 :(得分:2)

Thread.yield()不是您需要的。该函数的作用是告诉VM该线程目前是否愿意放弃CPU。它既没有指定多长时间,也没有强制VM将CPU分配给另一个线程。此功能的确切行为未标准化。这意味着,VM根本不需要做任何事情!

所有这个功能都是为了表示现在是将CPU交给另一个线程的好时机。

您需要的是互斥锁,信号量或synchronized,所以基本上是任何类型的真正同步。

我建议你阅读一些关于多线程的教程。

答案 1 :(得分:1)

这是Dakkaron的好建议的补充。

你想要达到的目标是什么?你只是想了解线程吗?

Dakkaron解释说Thread.yield()不会提供任何保证行为。如果您只是想了解挂起线程并查看是否可以在其他线程完成之前让主线程完成其工作,那么您可以使用Thread.sleep(1)。你真的只想使用这是一个测试场景 - 不在你的生产代码中,因为它显然会影响性能。如果您试图对线程序列施加一些控制,那么您可以考虑线程优先级,但这种机制实际上只是用于尝试提高性能,而不是执行执行控制。

如果您正在学习如何编写多线程代码,那么建议您不要直接使用线程,而是要了解作为Executor framework的一部分提供的更好的抽象(链接是版本8但是框架)自Tiger发布以来一直存在。)。

答案 2 :(得分:0)

您需要为线程设置优先级。 Thread.yield()使当前正在执行的线程对象暂时暂停并允许其他高优先级线程执行。在设计多线程应用程序时,请记住不要依赖线程优先级。因为无法保证线程调度优先级行为,所以使用线程优先级作为提高程序效率的方法,但只要确保您的程序没有。取决于该行为的正确性。