Ordinary hut

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

          2011年3月4日

          java中wait和notify的簡單理解
          1 它們都是Object的屬性;
          2 wait:釋放對象鎖;由于把鎖釋放了,當前線程就會卡住,繼續再等待獲取鎖的機會(也許是干了一半的活后,就把活交出去了,然后等待繼續干活的機會);
          3 notify:告訴其中一個等待的線程(具體哪一個不知道),我已經用完這個對象,你可以繼續用了
          4 它們都要包含在synchronized塊里,只有先鎖住這個對象,才能進行wait、notify操作;

          例子:
          1 定義一個普通對象
          public class MyObj {
              public String name;
          }
          2 主線程類,定義MyObj對象,new兩個線程
          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);//啟動線程1,然后主線程睡眠1秒鐘,再啟動2
                  t2.start();
                  
              }

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

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

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

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

          }
          結果顯示1和7


          posted @ 2013-04-27 15:23 landor 閱讀(360) | 評論 (0)編輯 收藏

          轉載 http://supertoffy.blog.163.com/blog/static/16447681820116150115743/


          每個地區都有自己的本地時間,在網上以及無線電通信中時間轉換的問題就顯得格外突出。我自己就經?;煜诖?,特地研究了一下,記錄在此以備忘。
          整個地球分為二十四時區,每個時區都有自己的本地時間。在國際無線電通信場合,為了統一起見,使用一個統一的時間,稱為通用協調時(UTC, Universal Time Coordinated)。UTC與格林尼治平均時(GMT, Greenwich Mean Time)一樣,都與英國倫敦的本地時相同。在本文中,UTC與GMT含義完全相同。
          北京時區是東八區,領先UTC八個小時,在電子郵件信頭的Date域記為+0800。如果在電子郵件的信頭中有這么一行:
          Date: Fri, 08 Nov 2002 09:42:22 +0800
          說明信件的發送地的地方時間是二○○二年十一月八號,星期五,早上九點四十二分(二十二秒),這個地方的本地時領先UTC八個小時(+0800,就是東八區時間)。電子郵件信頭的Date域使用二十四小時的時鐘,而不使用AM和PM來標記上下午。
          以這個電子郵件的發送時間為例,如果要把這個時間轉化為UTC,可以使用一下公式:
          UTC + 時區差 = 本地時間
          時區差東為正,西為負。在此,把東八區時區差記為 +0800,
          UTC + (+0800) = 本地(北京)時間 (1)
          那么,UTC = 本地時間(北京時間))- 0800 (2)
          0942 - 0800 = 0142
          即UTC是當天凌晨一點四十二分二十二秒。如果結果是負數就意味著是UTC前一天,把這個負數加上2400就是UTC在前一天的時間。例如,本地(北京)時間是 0432 (凌晨四點三十二分),那么,UTC就是 0432 - 0800 = -0368,負號意味著是前一天, -0368 + 2400 = 2032,既前一天的晚上八點三十二分。
          紐約的時區是西五區,比UTC落后五個小時,記為 -0500:
          UTC + (-0500) = 紐約時間 (3)
          UTC = 紐約時間 + 0500 (4)

          posted @ 2013-04-22 17:04 landor 閱讀(291) | 評論 (0)編輯 收藏

               摘要: struts2單獨使用沒有任何問題,加入spring后,發現頁面表單可以傳到struts2的action中,但是返回到頁面后,數據丟失,  閱讀全文

          posted @ 2012-08-19 23:06 landor 閱讀(1073) | 評論 (0)編輯 收藏

               摘要: Camel與cxf  閱讀全文

          posted @ 2011-09-29 13:50 landor 閱讀(2342) | 評論 (2)編輯 收藏

               摘要: XPath記錄  閱讀全文

          posted @ 2011-09-15 14:49 landor 閱讀(343) | 評論 (0)編輯 收藏

               摘要: JAXB2完成java bean到xml的相互轉換  閱讀全文

          posted @ 2011-06-03 12:04 landor 閱讀(7882) | 評論 (1)編輯 收藏

               摘要: Could not parse date - Class: java.text.DateFormat
          Caused by: java.text.ParseException: Unparseable date:  閱讀全文

          posted @ 2011-05-23 15:54 landor 閱讀(1074) | 評論 (0)編輯 收藏

               摘要: 轉載 - spring 動態數據源切換  閱讀全文

          posted @ 2011-03-30 21:30 landor 閱讀(350) | 評論 (0)編輯 收藏

               摘要: maven一些說明  閱讀全文

          posted @ 2011-03-04 16:29 landor 閱讀(751) | 評論 (0)編輯 收藏

          主站蜘蛛池模板: 中西区| 湛江市| 冀州市| 凤山市| 泰和县| 新宾| 长宁县| 资中县| 武清区| 沅江市| 临安市| 德州市| 淄博市| 贺州市| 麻江县| 固原市| 元阳县| 马尔康县| 罗平县| 八宿县| 兰考县| 阿合奇县| 二连浩特市| 玛曲县| 阿瓦提县| 城固县| 鱼台县| 陵川县| 甘德县| 土默特左旗| 汶上县| 黑水县| 广水市| 垣曲县| 滕州市| 青铜峡市| 茶陵县| 东乌珠穆沁旗| 西平县| 六盘水市| 安泽县|