少年阿賓

          那些青春的歲月

            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 閱讀(357) 評論(0)  編輯  收藏 所屬分類: JavaMultithread
          主站蜘蛛池模板: 东至县| 蕲春县| 洪湖市| 宿迁市| 天峻县| 张家界市| 陵水| 扎赉特旗| 宁阳县| 安图县| 如皋市| 东辽县| 保德县| 昌平区| 东乡族自治县| 闽侯县| 乐清市| 双城市| 台北市| 六枝特区| 耒阳市| 蛟河市| 临夏市| 仁化县| 尚志市| 云龙县| 上蔡县| 义乌市| 林周县| 延庆县| 淄博市| 石泉县| 宿州市| 梁平县| 瑞丽市| 仁寿县| 桃园县| 阿克苏市| 宜兴市| 寿阳县| 龙江县|