少年阿賓

          那些青春的歲月

            BlogJava :: 首頁 :: 聯系 :: 聚合  :: 管理
            500 Posts :: 0 Stories :: 135 Comments :: 0 Trackbacks
          1. 看到一個題目:針對下面的程序,寫出magic方法 讓整個程序只打印出step1,step2 不打印step3  

              public static void enter(Object obj) {
                  System.out.println("Step 1");
                  try {
             magic1(obj);
            } catch (Exception e) {
             // TODO Auto-generated catch block
             e.printStackTrace();
            }
                  System.out.println("Step 2");
                  synchronized (obj) {
                      System.out.println("Step 3 (never reached here)"); 
                  }
              }

           題目的意思很容易理解,可是要做出這道題目需要對多線程的基本改進非常的理解。

          下面列出基本思路:

           

           

          主線程想獲取obj的鎖,但是獲取不到,說明子線程始終在占據著這個對象的鎖。

          同時主線程又能返回。

          那現在就要實現讓子線程先跑,然后再喚醒主線程。這個顯然是鎖的占有和喚醒,那么問題來了,將什么做為這個鎖呢?如果是obj的話,不可能,因為子線程顯然不能在放掉obj.

          那么只能是子線程自己的鎖。

           

          下邊是程序

              static void magic1(final Object obj) throws Exception{
               final Thread t = new Thread(){
                public void run(){
                 synchronized(this){
                  synchronized(obj){
                   try {
                    notify();
                 join();
                } catch (InterruptedException e) {
                }
                  }
                  
                 }
                 
                }
               };
               synchronized(t){
                t.start();
                t.wait();
               }
              }




          posted on 2012-11-09 21:37 abin 閱讀(352) 評論(0)  編輯  收藏 所屬分類: JavaMultithread
          主站蜘蛛池模板: 夹江县| 商水县| 江孜县| 宜丰县| 福安市| 呼和浩特市| 馆陶县| 西平县| 岚皋县| 宝山区| 资阳市| 屯门区| 交口县| 泸溪县| 琼结县| 从江县| 晋州市| 花莲市| 台东市| 台江县| 甘孜县| 安岳县| 梁山县| 怀仁县| 通辽市| 海南省| 东平县| 平陆县| 石渠县| 南靖县| 两当县| 武汉市| 太谷县| 鹤峰县| 循化| 壤塘县| 河北省| 濮阳县| 平乐县| 五家渠市| 庆安县|