刚刚看到JAVA线程控制这里,做了一个例子,这个郁闷啊~~
完全不知道join()  yield()   这两个方法是做什么用的
请高手指点一下哈
辛苦辛苦啦例子如下
    class FlagSend
        implements Runnable {
      volatile int theValue;
      volatile boolean isValue;      public void run() {
        for (int i = 0; i < 5; i++) {
          while (isValue) {
            Thread.yield();
          }
          theValue = (int) (Math.random() * 100);
          System.out.println("sending:" + theValue);
          isValue = true;
        }
      }
    }    class FlagRec
        implements Runnable {
      FlagSend sendflag;
      public FlagRec(FlagSend flagsend) {
        sendflag = flagsend;
      }      public void run() {
        while (true) {
          while (!sendflag.isValue) {
            Thread.yield();
          }
          System.out.println("received:" + sendflag.theValue);
          sendflag.isValue = false;
        }
      }
    }    FlagSend s = new FlagSend();
    FlagRec r = new FlagRec(s);    Thread st = new Thread(s);
    Thread rt = new Thread(r);    st.start();
    rt.start();
    
    st.join();
    try {
      while (s.isValue) {
        Thread.sleep(1000);
      }
    }
    catch (InterruptedException ex) {
    }

解决方案 »

  1.   

    你的程序不完整,看不懂,说一些用法。sleep()和yield()的区别
    1) sleep()使当前线程进入停滞状态,所以执行sleep()的线程在指定的时间内肯定不会执行;yield()只是使当前线程重新回到可执行状态,所以执行yield()的线程有可能在进入到可执行状态后马上又被执行。
    2) sleep()可使优先级低的线程得到执行的机会,当然也可以让同优先级和高优先级的线程有执行的机会;yield()只能使同优先级的线程有执行的机会。使调用join()的线程执行完毕后才能执行其它线程,在一定意义上,它可以实现同步的功能。
      

  2.   

    也就是说
    Thread1.join();
    System.out.println("aaa");只有当Thread1执行完成之后
    才能打印出来aaa?
    对吗?
      

  3.   


    //也就是说
    //Thread1.join();
    //System.out.println("aaa");//只有当Thread1执行完成之后
    //才能打印出来aaa?
    //对吗?
    可以这么说。
    join():用于不同线程间的联系,当一个线程1调用另一个线程2的join()方法,那么线程1在线程2结束前就会被挂起(除非设置timeout)。由于也可以被interrupt()打断,所以也要放在try域中。
      

  4.   

    join()的意思是,例如A线程中,启动了B线程,如果调用B线程的.join()方法,那么A线程就一直等到B线程运行完毕才退出。如果A线程调用了yield(),作用就是A线程暂时不执行,让B线程来执行,但这种让步,只让一步,意思说如果A线程跟B线程都在进行循环输出一行语句的话,假设A总是先于B输出出,用了yield(),A只是让B先于自己循环一次。
      

  5.   

    关于yield(),可能我上面说得不够细,如果线程A分别调用了B,C,D三个线程,假定本来机器优先执行的顺序是A->B->C->D的,A线程调用yield()后,就变成A是排在B,C,D后面,是最后一个执行的。