A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

  1. package cn.itcast.thread;
  2. /*
  3. * 要求:线程的通信问题,实现姓名和性别的相符输出,并最后间隔打印出两个人的姓名和性别。
  4. */
  5. public class PrintThreadDemo {

  6.         public static void main(String[] args) {
  7.                 Resource r=new Resource();//保证是同一数据源
  8.                 Input in=new Input(r);
  9.                 Output out=new Output(r);
  10.                
  11.                 Thread t0=new Thread(in);
  12.                 Thread t1=new Thread(out);
  13.                
  14.                 t0.start();
  15.                 t1.start();
  16.         }

  17. }
  18. class Resource  {//数据源
  19.         String name;
  20.         String sex;
  21. }
  22. class Input implements Runnable
  23. {
  24.         private Resource r;
  25.         public Input(Resource r)
  26.         {
  27.                 this.r=r;
  28.         }
  29.         boolean flag=true;
  30.         int i=0;
  31.         public void run()
  32.         {
  33.                 while(true)
  34.                 {
  35.                         synchronized(r)
  36.                         {
  37.                                 //添加标志位,为false,表示尚有未打印的数据。
  38.                                 if(r.flag==false){
  39.                                         try{r.wait();}catch(Exception e){}//wait()方法异常处理
  40.                                 }else{
  41.                                         if(i%2==0)//偶数给男的赋值
  42.                                         {
  43.                                                 r.name="zhangsan";
  44.                                                 r.sex="male";
  45.                                         }
  46.                                         else//奇数给女的赋值
  47.                                         {
  48.                                                 r.name="丽丽";
  49.                                                 r.sex="女";
  50.                                         }
  51.                                                 i++;
  52.                                                 flag=false;//赋值结束后,标志位置反
  53.                                                 r.notify();
  54.                                 }
  55.                                
  56.                         }
  57.                 }               
  58.         }
  59. }
  60. class Output implements Runnable{
  61.         private Resource r;
  62.         public Output(Resource r){
  63.                 this.r=r;
  64.         }
  65.         boolean flag=true;
  66.         public void run(){
  67.                 while(true){
  68.                         synchronized(r){
  69.                                 //标志位为false,打印姓名和性别。
  70.                                 if(r.flag==false){
  71.                                         System.out.println(Thread.currentThread().getName()+"..."+r.name+"..."+r.sex);
  72.                                         flag=true;
  73.                                         r.notify();
  74.                                 }else{
  75.                                         try{r.wait();}catch(Exception e){}
  76.                                        
  77.                                 }
  78.                         }
  79.                 }
  80.                        
  81.         }
  82. }
复制代码
为什么打印的男女姓名和性别:Q不是交替出现的呢?

0 个回复

您需要登录后才可以回帖 登录 | 加入黑马