public class SomeThing {

public static void main(String[] args) throws InterruptedException{

Thread a=new Thread(new Task1());
a.setName("a");

doing();
a.start();
}

static void doing() throws InterruptedException{
String name=Thread.currentThread().getName();
int p=Thread.currentThread().getPriority();

for(int i=0; i<50; i++){
System.out.printf("%-10s__%02d__p%d%n",name,i,p);

if(name.equals("main") && i==20)
Thread.yield();            //***
}
}

static class Task1 implements Runnable{

public void run(){

try{
doing();
}catch(InterruptedException ie){
System.out.println("Task1");
}
}
}
}
预期结果:
当输出"main      __20__p5"
以后,
紧接着的一行应该是a开头"a......"
预期结果没达到,为什么?

解决方案 »

  1.   

    yield并不能保证什么,它只是让调用它的线程暂停执行,让虚拟机重新选一个跟它具有同样优先级的线程去执行。
    不能保证虚拟机不会再次选到刚刚暂停的线程。
      

  2.   

    如果你用的是yield,你所谓的“屡试屡成功”可能是特定于你的电脑,如果换到别的电脑上执行,
    也许就不行了。这种无法确定结果的东西,还是少用。如果你想保证线程会暂停,用sleep(timeout),
    它可以保证至少暂停timeout 毫秒。