我有以下课程:
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()的理解有问题。
答案 0 :(得分:4)
文档说明这与yield
方法有关:
使当前正在执行的线程对象暂时暂停并允许其他线程执行。
即使可能发生这种情况,也没有什么可以保证您选择要处理的线程不是同一个。
几乎所有的协作线程都不要依赖于此,因为您无法保证预期的功能。
答案 1 :(得分:3)
我引用here:
这种静态方法主要用于通知系统当前线程愿意“放弃CPU”一段时间。一般的想法是: 线程调度程序将选择要运行的其他线程而不是当前线程。 但是,线程调度程序如何实现让步的细节因平台而异。一般来说,你不应该依赖它以特定的方式行事。不同的事情包括: 在屈服之后,线程将有机会再次运行; 该线程是否放弃其剩余量。
因此,简而言之,您永远不知道何时会再次启动线程执行。