class Runn1 implements Runnable
{
public void run()
{
for (int i = 0;i<100 ;i++ )
{
System.out.print("*");
Thread.yield();
}
}
}
class Runn2 implements Runnable
{
public void run()
{
for (int i = 0;i<100 ;i++ )
{
System.out.print("+");
Thread.yield();
}
}
}
public class RunnTest2
{
public static void main(String [] args)
{
Runn1 r1 = new Runn1();
Runn2 r2 = new Runn2();
Thread t1 = new Thread(r1);
Thread t2 = new Thread(r2);
t1.start();
t2.start();
}
}
为什么运行的结果不是*+*+ 这样有规律的 而运行的结果为什么没有规律的

解决方案 »

  1.   

    Thread.yield()只是让当前线程从执行状态变成可执行状态,并不一定会执行其他线程而该线程在下一次不会执行到了。楼主可以想象到数学概率论中有那种放回抽取和不放回抽取。yield()可以理解为放回抽取(从所有的可执行状态中抽取)
      

  2.   

    两个线程能你一下我一下的来回有规律的进行,用yield()是不行的,首先要让两个线程实现通信,也就是说我停下来了就要告诉你让你去执行,你停下来了就告诉我让我执行。而yield()作用就像楼上所说的:只是让当前线程从执行状态变成可执行状态,并不一定会执行其他线程而该线程在下一次不会执行到了。有很多让线程间通信的办法,jdk5.0更是提供了多种方式方式。你可以看看jdk5.0的api中java.util.concurrent包是的类库,里面都是关于并发的类,有很多种方式来实现上面的结果。