在Java中使用Thread.yield()

时间:2013-03-27 19:45:05

标签: java multithreading

我有以下课程:

package net.adjava.multithreading;

public class MyResource {

    private int a;



    public int getA() {
        return a;
    }

    public void setA(int a) {
        this.a = a;
    }

}

package net.adjava.multithreading;

public class Thread1 extends Thread {
    MyResource m;

    public Thread1(MyResource m) {
        super();
        this.m = m;
    }

    @Override
    public void run() {
        System.out.println("Current Thread name1 :"
                + Thread.currentThread().getName());

        for (int i = 0; i < 10000; i++) {
            m.setA(i);
            System.out.println("Set method sets the value of a as: " + i);
            System.out.println("Current Thread name1 :"
                    + Thread.currentThread().getName());

            Thread.yield();

        }
    }
}

package net.adjava.multithreading;

public class Thread2 extends Thread {

    MyResource m;
    public Thread2(MyResource m) {
        super();
        this.m = m;
    }
    @Override
    public void run() {
        System.out.println("Current Thread name2 :" + Thread.currentThread().getName());

        for (int i = 0; i < 100; i++) {

            System.out.println(" value of a as per getter method is :"
                    + m.getA());
            System.out.println("Current Thread name2 :" + Thread.currentThread().getName());


        }
        System.out.println("waiting for thread to end");

    }

}

package net.adjava.multithreading;

public class ThreadExecutionPoint {

    public static void main(String args[])
    {
        System.out.println("Current Thread name main :" + Thread.currentThread().getName());

        MyResource m = new MyResource();
        Thread1 th1 = new Thread1(m);
        Thread2 th2 = new Thread2(m);
        th1.start();
        th2.start();

    }
}

我试图用上面的类来理解yield()的目的。在尝试这个例子之前我所知道的yield()就是它暂停调用它的线程。所以为了测试它我在Thread1类中使用了yield方法。所以基本上根据我的理解,thread1应该执行for循环一次然后应该暂停并等待其他线程完成。但输出显示不同的结果。输出显示第一个thread1被执行然后执行thread2。有人可以纠正我错过的东西吗?或者我对yield()的理解有问题。

2 个答案:

答案 0 :(得分:4)

文档说明这与yield方法有关:

  

使当前正在执行的线程对象暂时暂停并允许其他线程执行。

即使可能发生这种情况,也没有什么可以保证您选择要处理的线程不是同一个。

几乎所有的协作线程都不要依赖于此,因为您无法保证预期的功能。

答案 1 :(得分:3)

我引用here

  

这种静态方法主要用于通知系统当前线程愿意“放弃CPU”一段时间。一般的想法是:       线程调度程序将选择要运行的其他线程而不是当前线程。       但是,线程调度程序如何实现让步的细节因平台而异。一般来说,你不应该依赖它以特定的方式行事。不同的事情包括:       在屈服之后,线程将有机会再次运行;       该线程是否放弃其剩余量。

因此,简而言之,您永远不知道何时会再次启动线程执行。