少年阿賓

          那些青春的歲月

            BlogJava :: 首頁 :: 聯(lián)系 :: 聚合  :: 管理
            500 Posts :: 0 Stories :: 135 Comments :: 0 Trackbacks

           

          問題解決2——加入等待與喚醒


          package edu.sjtu.erplab.thread;

          class Info{
              private String name="name";
              private String content="content";
              private boolean flag=true;
              public  synchronized void set(String name,String content)
              {
                  if(!flag)//標(biāo)志位為false,不可以生產(chǎn)
                  {
                      try {
                          super.wait();
                      } catch (InterruptedException e) {
                          // TODO Auto-generated catch block
                          e.printStackTrace();
                      }
                  }
                  this.setName(name);
                  try {
                      Thread.sleep(30);
                  } catch (InterruptedException e) {
                      // TODO Auto-generated catch block
                      e.printStackTrace();
                  }
                  this.setContent(content);
                  flag=false;//修改標(biāo)志位為false,表示生產(chǎn)者已經(jīng)完成資源,消費(fèi)者可以消費(fèi)。
                  super.notify();//喚醒消費(fèi)者進(jìn)程
              }
             
              public synchronized void get()
              {
                  if(flag)
                  {
                      try {
                          super.wait();
                      } catch (InterruptedException e) {
                          // TODO Auto-generated catch block
                          e.printStackTrace();
                      }
                  }
                  try {
                      Thread.sleep(30);
                  } catch (InterruptedException e) {
                      // TODO Auto-generated catch block
                      e.printStackTrace();
                  }
                  System.out.println(this.getName()+":-->"+this.getContent());
                  flag=true;//修改標(biāo)志位為true,表示消費(fèi)者拿走資源,生產(chǎn)者可以生產(chǎn)。
                  super.notify();//喚醒生產(chǎn)者進(jìn)程。
              }
             
             
              public String getName() {
                  return name;
              }
              public void setName(String name) {
                  this.name = name;
              }
              public String getContent() {
                  return content;
              }
              public void setContent(String content) {
                  this.content = content;
              }
             
          }

          class Producer implements Runnable{
              private Info info=null;
              public Producer(Info info)
              {
                  this.info=info;
              }
             

              @Override
              public void run() {
                  boolean flag=false;
                  for(int i=0;i<10;i++)
                      if(flag)
                      {
                          this.info.set("name+"+i, "content+"+i);
                          flag=false;
                      }
                      else
                      {
                          this.info.set("name-"+i, "content-"+i);
                          flag=true;
                      }
              }
          }

          class Consumer implements Runnable{
              private Info info=null;
              public Consumer(Info info)
              {
                  this.info=info;
              }
              @Override
              public void run() {
                  for(int i=0;i<10;i++)
                  {
                      try {
                          Thread.sleep(10);
                      } catch (InterruptedException e) {
                          // TODO Auto-generated catch block
                          e.printStackTrace();
                      }
                      this.info.get();
                  }
                 
              }
          }

          public class ThreadDeadLock {
              public static void main(String args[])
              {
                  Info info=new Info();
                  Producer pro=new Producer(info);
                  Consumer con=new Consumer(info);
                  new Thread(pro).start();
                  new Thread(con).start();
              }
             
          }




          http://www.cnblogs.com/xwdreamer/archive/2011/11/20/2296931.html#2397397

          posted on 2012-08-02 15:30 abin 閱讀(469) 評(píng)論(0)  編輯  收藏 所屬分類: JavaMultithread
          主站蜘蛛池模板: 娄烦县| 谷城县| 海口市| 合江县| 岑巩县| 广安市| 菏泽市| 申扎县| 杂多县| 林西县| 林口县| 额尔古纳市| 荔波县| 荔浦县| 天长市| 朝阳市| 固阳县| 隆尧县| 鹤庆县| 宝丰县| 辽阳县| 白银市| 丽江市| 阜阳市| 呼图壁县| 绥阳县| 辽阳县| 弋阳县| 遂宁市| 尚义县| 南昌市| 钦州市| 元谋县| 湾仔区| 鸡东县| 南京市| 营口市| 鞍山市| 陵水| 阿克陶县| 久治县|