Ordinary hut

          人間一福地,勝似天仙宮
          posts - 61, comments - 50, trackbacks - 0, articles - 1

          Notify和Wait的簡(jiǎn)單理解

          Posted on 2013-04-27 15:23 landor 閱讀(361) 評(píng)論(0)  編輯  收藏 所屬分類: java
          java中wait和notify的簡(jiǎn)單理解
          1 它們都是Object的屬性;
          2 wait:釋放對(duì)象鎖;由于把鎖釋放了,當(dāng)前線程就會(huì)卡住,繼續(xù)再等待獲取鎖的機(jī)會(huì)(也許是干了一半的活后,就把活交出去了,然后等待繼續(xù)干活的機(jī)會(huì));
          3 notify:告訴其中一個(gè)等待的線程(具體哪一個(gè)不知道),我已經(jīng)用完這個(gè)對(duì)象,你可以繼續(xù)用了
          4 它們都要包含在synchronized塊里,只有先鎖住這個(gè)對(duì)象,才能進(jìn)行wait、notify操作;

          例子:
          1 定義一個(gè)普通對(duì)象
          public class MyObj {
              public String name;
          }
          2 主線程類,定義MyObj對(duì)象,new兩個(gè)線程
          public class TestMain {

              public static MyObj obj = new MyObj();
              
              /**
               * 
          @param args
               
          */
              public static void main(String[] args) throws Throwable {
                  new TestMain().myTest();
              }
              
              public void myTest() throws Throwable{
                  Test1 test1 = new Test1();
                  Test2 test2 = new Test2();
                  
                  Thread t1 = new Thread(test1); 
                  Thread t2 = new Thread(test2); 
                  
                  t1.start();
                  Thread.sleep(1000);//啟動(dòng)線程1,然后主線程睡眠1秒鐘,再啟動(dòng)2
                  t2.start();
                  
              }

          }
          3 定義線程1,:
          public class Test1 implements Runnable{

              @Override
              public void run() {
                  synchronized (TestMain.obj) {//占有對(duì)象鎖
                      try {
                          TestMain.obj.name="1";
                          System.out.println(TestMain.obj.name); //打印出1
                          TestMain.obj.wait();  //釋放對(duì)TestMain.obj對(duì)象的鎖,同時(shí)當(dāng)前線程立即卡住,陷入等待
                          System.out.println(TestMain.obj.name);//只有線程再次搶到TestMain.obj的鎖后,才會(huì)運(yùn)行
                      } catch (InterruptedException e) {
                          e.printStackTrace();
                      }
                  }
              }

          }
          4 線程2:
          public class Test2 implements Runnable{

              @Override
              public void run() {
                  
                  synchronized (TestMain.obj) { //當(dāng)線程1釋放這個(gè)對(duì)象的鎖時(shí),本線程立即得到
                      TestMain.obj.name = "2"; //改值
                      TestMain.obj.notify();//通知占用了TestMain.obj且當(dāng)前是等待的線程(線程1)可以繼續(xù),但是必須等到本synchronized塊執(zhí)行完畢。
                      TestMain.obj.name = "3";
                      TestMain.obj.name = "4";
                      
                      try {
                          Thread.sleep(1000);
                      } catch (InterruptedException e) {
                          e.printStackTrace();
                      }
                      TestMain.obj.name = "7";//執(zhí)行完畢,此時(shí)線程1被喚醒,會(huì)打印出7
                  }
              }

          }
          結(jié)果顯示1和7


          主站蜘蛛池模板: 桐梓县| 东明县| 福鼎市| 辽宁省| 花莲县| 襄垣县| 景泰县| 安义县| 丁青县| 泾阳县| 景宁| 河南省| 邛崃市| 新绛县| 东方市| 呼和浩特市| 洛浦县| 乌苏市| 安庆市| 商河县| 阿鲁科尔沁旗| 岢岚县| 吴桥县| 大连市| 海兴县| 昌吉市| 湘乡市| 潢川县| 巩义市| 库尔勒市| 达拉特旗| 晋宁县| 晋州市| 内乡县| 图们市| 台东县| 孝感市| 西盟| 正蓝旗| 福州市| 连城县|