黑马程序员技术交流社区

标题: 这个线程安全应如何解决? [打印本页]

作者: hurryup    时间: 2013-11-17 19:25
标题: 这个线程安全应如何解决?
/*多线程_等待唤醒机制*/

/**
*需求:创建两个线程,一个进行存储信息,一个进行打印信息。
*目的:程序输入一个"mike man"打印一个"mike man"
*           输入一个"莉莉 女女女女女"打印一个"莉莉 女女女女女"
*步骤:创建一个共享资源类RescourceWaitNotifyDemo
*                创建输入线程类InputWaitNotifyDemo
*                创建打印线程类OutputWaitNotifyDemo
*                由主函数创建线程,并执行。
*问题:
*                求大虾回答这里线程安全问题在哪里?
*                怎么解决?
*/

/*线程共享资源类,信息类*/
  1. class ResourceWaitNotifyDemo //
  2. {
  3.         private String name;
  4.         private String sex;
  5.         private boolean flag=false;


  6.         public synchronized void setInfo(String name,String sex)//信息输入函数
  7.         {
  8.                 if(flag)
  9.                 /*如果flag值为false,则共享资源中没有信息,进行赋值
  10.                   如果为true,则共享资源中有信息没有打印,不进行赋值,进行wait操作
  11.                 */        
  12.                 {
  13.                         try
  14.                         {  
  15.                                 this.name = name;
  16.                                 this.sex = sex;
  17.                                 this.wait();
  18.                         }
  19.                         catch (Exception e)
  20.                         {
  21.                         }
  22.                 }else{
  23.                
  24.                           
  25.                         }                  
  26.                         
  27.                 flag=true;         //改变开关,让输入程序不能再次进行赋值,同时可以让打印程序启动
  28.                 this.notify();//唤醒输出线程
  29.         }

  30.         public synchronized void OutInfo()//信息输出函数
  31.         {
  32.                 if (!flag)//如果flag值为ture,则共享资源中有信息,进行打印,否则等待
  33.                 {
  34.                         try
  35.                         {
  36.                                 System.out.println(name+"......"+sex);  
  37.                                 this.wait();
  38.                                
  39.                         }
  40.                         catch (Exception e)
  41.                         {
  42.                         }
  43.                 }
  44.                else{
  45.                                              
  46.                     }         
  47.                 flag=false;        //改变开关,让输入程序可以进行赋值,同时让自己不能在打印
  48.                 this.notify();//唤醒输入线程
  49.         }
  50. }

  51. /*输入线程*/
  52. class InputWaitNotifyDemo implements Runnable
  53. {
  54.         private ResourceWaitNotifyDemo r;        //创建共享类引用

  55.         InputWaitNotifyDemo(ResourceWaitNotifyDemo r)
  56.         {
  57.                 this.r = r;        //接收共享类对象
  58.         }

  59.         public void run()
  60.         {
  61.                 int x=0;
  62.                 while(true)
  63.                 {        
  64.                         if (x==0)
  65.                         {
  66.                                 r.setInfo("mike","man");
  67.                         }
  68.                         else
  69.                         {
  70.                                 r.setInfo("莉莉","女女女女女");
  71.                         }
  72.                         x=(x+1)%2;                                                
  73.                 }
  74.         }

  75. }

  76. /*输出线程*/
  77. class OutputWaitNotifyDemo implements Runnable
  78. {
  79.         private ResourceWaitNotifyDemo r;

  80.         OutputWaitNotifyDemo(ResourceWaitNotifyDemo r)
  81.         {
  82.                 this.r = r;        //和输入线程操作同一个共享类对象
  83.         }

  84.         public void run()
  85.         {
  86.                 while (true)
  87.                 {
  88.                         r.OutInfo();        
  89.                 }
  90.         }
  91. }

  92. /*主函数*/
  93. class ThreadWaitNotifyTest
  94. {
  95.         public static void main(String[] args)
  96.         {
  97.                 ResourceWaitNotifyDemo res = new ResourceWaitNotifyDemo();
  98. /*
  99.                 InputWaitNotifyDemo i = new InputWaitNotifyDemo(res);
  100.                 OutputWaitNotifyDemo o = new OutputWaitNotifyDemo(res);

  101.                 Thread t1 = new Thread(i);
  102.                 Thread t2 = new Thread(o);

  103.                 t1.start();
  104.                 t2.start();
  105. */
  106.                 new Thread(new InputWaitNotifyDemo(res)).start();        //创建输入线程
  107.                 new Thread(new OutputWaitNotifyDemo(res)).start();        //创建打印线程
  108.         }
  109. }
复制代码

作者: 风逝    时间: 2013-11-17 22:37
加个同步锁,synchronized 和Lock,但Lock必须要手工释放,你这儿先必须让写线程先执行,读进程后执行。
作者: 黄炳期    时间: 2013-11-18 13:07
如果问题已经解决,请及时修改主题为“提问结束”。
修改主题的方法链接
http://bbs.itheima.com/thread-89313-1-1.html




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2