关于收益率的一些疑问()

时间:2012-03-16 14:09:07

标签: java

有关Thread.yield()方法的一些问题。我所理解的是当我们调用Thread.Yield()时,当前正在运行的线程将返回到runnable状态。依赖于线程优先级线程调度程序将执行下一个更高优先级的线程。现在我有一个示例程序。请参阅下文。

package thread;

public class YieldTest implements Runnable {

    @Override
    public synchronized  void run() {
        System.out.println(Thread.currentThread().getName()+", executing..");
        for(int i = 0 ; i <5;i++){
            if(i==2){               
                Thread.yield();
                System.out.println(Thread.currentThread().getName()+": "+i+" yielded()");
                /*try {
                    Thread.sleep(1000);
                    System.out.println(Thread.currentThread().getName()+": "+i+" yielded()");
                } catch (InterruptedException e) {

                    e.printStackTrace();
                }*/

            }else{
                System.out.println(Thread.currentThread().getName()+": "+i);
            }

        }       
    }


public static void main(String[] args) {

    YieldTest test = new YieldTest();
        Thread t1 = new Thread(test);
        t1.setName("A");
        t1.setPriority(9);
        Thread t2 = new Thread(test);
        t2.setName("B");
        Thread t3 = new Thread(test);
        t3.setName("C");

        t2.setPriority(6);
        t2.setPriority(4);

        t1.start();
        t2.start();
        t3.start();

    }


}

这里我总是按以下方式获取输出,

A, executing..
A: 0
A: 1
A: 2 yielded()
A: 3
A: 4
C, executing..
C: 0
C: 1
C: 2 yielded()
C: 3
C: 4
B, executing..
B: 0
B: 1
B: 2 yielded()
B: 3
B: 4

现在问题是yield()方法应该回到可运行状态,其他线程应该执行。所以输出应该类似于以下方式

A,执行..     答:0     答:1     答:2屈指()

C,执行..     C:0     C:1     C:2得出()

A: 3
A: 4

B,执行..     B:0     B:1     B:2得到()

C: 3
C: 4

B: 3
B: 4

另外,线程优先级怎么样?难道不保证为什么我们需要线程优先级?请纠正我如果我错了。

5 个答案:

答案 0 :(得分:2)

所有运行方法都在同一个对象上进行同步(测试)。因此,屈服不起任何作用,因为直到第一个线程的run方法退出,没有其他人可以进入他们的run()方法。

基本上线程1启动,并进入run()方法。这与'this'同步。在输出2个数字后,它会产生。但是线程2和3都在等待进入run方法,因为它们无法在测试时获得监视器。所以产量不会做任何事情。一旦完成第一个线程,就会发生同样的问题。

答案 1 :(得分:2)

当Java使用绿色线程时,产量更有用。现在,虽然它将通知操作系统,但线程可以处于等待状态(不可运行)。但是,操作系统和JVM真的要决定线程是否实际允许另一个线程运行。那个线程是你无法控制的。

但是,最终我从未使用任何产量。你想用它做什么?

答案 2 :(得分:1)

你是对的,不保证线程优先级。这只是对JVM的建议,JVM在决定实际运行哪个线程时可以查看其他因素。从技术上讲,JVM甚至可以随意选择,如果需要的话,仍然符合the JVM specification

答案 3 :(得分:0)

Thread.yield:这是一个静态方法,主要用于通知系统当前线程愿意“放弃CPU”一段时间。

线程调度程序可以选择要运行的其他线程而不是当前线程。

但是,线程调度程序如何实现让步的细节因平台而异。一般来说,你不应该依赖它以特定的方式行事。不同的事情包括:

1.when, after yielding, the thread will get an opportunity to run again;
2.whether or not the thread forgoes its remaining quantum. 

主题优先级:

在任何给定时间,优先级最高的线程都在运行。但是,这不能保证。线程调度程序可以选择运行较低优先级的线程以避免饥饿。因此,出于效率目的,仅将优先级用于影响调度策略。

答案 4 :(得分:0)

像线程优先级一样的Thread.yield()只是对操作系统的建议。无法保证yield()将停止当前线程。它不保证更高优先级的线程将在该点运行,因为操作系统可以在任何地方停止您的线程。无法保证优先级较高的线程具有更高的优先级,否则会产生任何差异。

恕我直言尝试用Java编写自己的调度程序并不是一个好主意。不太可能以你想象的方式提供帮助或行为。