微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

在Java中使用Thread.yield()

我有以下课程:

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()的理解有问题.

解决方法

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

Causes the currently executing thread object to temporarily pause and allow other threads to execute.

即使可能发生这种情况,也没有任何东西可以保证您选择要处理的线程不是同一个.

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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐