3

我有以下课程:

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 循环,然后应该暂停并等待其他线程完成。但输出显示不同的结果。输出显示首先执行线程 1,然后执行线程 2。有人可以纠正我所缺少的吗?或者我对产量()的理解有问题。

4

2 回答 2

4

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

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

即使认为这可能会发生,也没有什么能保证您将选择处理的线程不是同一个线程。

由于几乎所有协调线程,请不要依赖此,因为无法保证您期望的功能。

于 2013-03-27T19:47:48.967 回答
3

我从这里引用:

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

所以简而言之,你永远不知道线程执行何时会再次开始。

于 2013-03-27T19:47:29.290 回答