Java并發編程基礎知識片段

          Java 5并發包的加入,給Java的并發程序的開發帶來了很多的好處,在此列舉一些并發編程中應該掌握的一些基礎知識片斷,這些片斷基本都是由一些問題組成,在片段中沒有直接寫出答案,由于可用來解決這些片段的方法還是很多的,因此只是提到了解決問題可選方案的關鍵字,如果有需要進一步了解的話,基本上google一下應該就能查出來了,不過就像之前有朋友說的,如果不是經常用的話,其實就算現在知道了也是會忘記的,這很正常,:),不過我更認為那是因為知其然而不知其所以然造成的,很多東西如果知道原理的話,基本上還是可以記得很長一段時間的。
          片斷一
          在main中啟動兩個線程,例如:
              Thread a=new Thread(){
                  public void run(){
                       System.out.println("Call A");
                       try{
                            Thread.sleep(1000);
                       }
                       catch(Exception e){
                           e.printStackTrace();
                       }
                  }
              };
              Thread b=new Thread(){
                  public void run(){
                       try{
                            Thread.sleep(500);
                       }
                       catch(Exception e){
                           e.printStackTrace();
                       }
                       System.out.println("Call B");
                  }
              };   
              a.start();
              b.start();   
              System.out.println("execute here");
          在這樣的方式下,執行時會出現什么樣的效果;
          怎么樣才能保證字符串的打印順序是:"Call B"-->"Call A"-->"execute here"呢?(提示:join、wait/notify、Semphore、Lock等)
          在做到了上面打印順序控制后,怎么樣才能做到如果線程b執行了100毫秒還沒執行完的話則直接繼續線程a的執行呢?(提示:ExecutorServices、Future)
          片段二
          也是個控制順序的問題,假設有如下一段代碼:
          for(int i=0;i<10;i++){
              Thread thread=new Thread(){
                  public void run(){
                      ...
                  }
              };
              thread.setName("Thread-"+i);
              thread.start();
          }
          System.out.println("All Executed");
          需要做到所有線程同時運行,而不是按照for的順序一個一個啟動,并且要求All Executed需要在所有線程都執行完畢后才打印,有什么辦法做到呢?(提示:CountDownLatch等)
          片段三
          Map<String,Object> datas=new ConcurrentHashMap<String,Object>();
          public Object get(String keyName){
              Object data=null;
              if(!datas.containsKey(keyName)){
                   data=createData(keyName);
                   datas.put(keyName,data);
              }
              else{
                   data=datas.get(keyName;)
              }
              return data;
          }
          上面這段代碼在并發時會出什么問題呢,為什么?
          如果有問題的話,應該怎么去解決呢?(提示:Synchronized、Lock、FutureTask等)
          片段四
          ThreadPoolExecutor executor=new ThreadPoolExecutor(10,100,60L,TimeUnit.SECONDS,new LinkedBlockingQueue<Runnable>(20),new ThreadPoolExecutor.AbortPolicy());
          一個這樣的線程池,當并發請求數為15時會是怎么個狀況?(池的使用狀況,例如活動線程數、隊列中的數等)
          當并發請求數為100的時候是什么狀況?
          當并發請求數為200的時候是什么狀況?
          當30秒內不再有請求時會怎么樣?
          當2分鐘內沒有請求時會怎么樣?
          如果換成以下方式初始化池又會怎么樣呢:
          ThreadPoolExecutor executor=new ThreadPoolExecutor(10,150,20L,TimeUnit.SECONDS,new SynchronousQueue<Runnable>(),new ThreadPoolExecutor.AbortPolicy());
          片段五
          怎么查看jvm中線程的執行狀況,線程的狀態有哪幾種,分別表示什么含義?
          ThreadFactory有什么用?
          如果要捕捉線程中拋出的異常,可以怎么做呢?
          如果TimerTask拋出運行時異常會不會影響到同一個Timer中其他的TimerTask的執行呢,SchedularThreadPoolExecutor和Timer有什么不同?
          片段六
          常見的一個例子:
          private int count;
          public synchronized int getNext(){
              return count++;
          }
          在JDK5有什么別的方法來進行實現嗎?
          像JDK5中的AtomicInteger的incrementAndGet是怎么實現的呢?
          如果這個count要按線程來獨立管理,即每個線程有自己的一個count,要怎么做呢?

          posted on 2008-06-20 01:29 BlueDavy 閱讀(7930) 評論(4)  編輯  收藏 所屬分類: Java

          評論

          # re: Java并發編程基礎知識片段 2008-06-25 14:36 鄧芝

          c、c++、Java、C#等非并行程序語言,對于多線程[甚至多進程]環境下的一些基本概念一直都沒有改變過。同步、信號量、同步鎖、互斥鎖、共享[內存、對象、資源]等等,不同語言的實現機制完全不同,隨著多核CPU的出現實現方式也有變化(通常底層類庫的實現者需要考慮這些問題)。具體應該使用哪個概念,那個技術,需要依據場景的不同而進行針對性的選擇。
          非常感謝BlueDavy,總是提出好些關鍵話題,讓我也忍不住要寫點東西,把自己的一些經驗分享一下。:)  回復  更多評論   

          # re: Java并發編程基礎知識片段 2008-06-25 17:32 BlueDavy

          @鄧芝
          好事呀,就應該把你的經驗也給大家多分享分享的。  回復  更多評論   

          # re: Java并發編程基礎知識片段 2008-07-09 20:37 網站建設

          只能說session用的時候要非常注意吧,  回復  更多評論   

          # re: Java并發編程基礎知識片段[未登錄] 2008-08-12 11:25 kruce

          片斷3你想鎖住整個Map對象么?
          貌似不可取
          Callable, Future, FutureTask, putIfAbsent  回復  更多評論   

          公告

           









          feedsky
          抓蝦
          google reader
          鮮果

          導航

          <2008年6月>
          25262728293031
          1234567
          891011121314
          15161718192021
          22232425262728
          293012345

          統計

          隨筆分類

          隨筆檔案

          文章檔案

          Blogger's

          搜索

          最新評論

          閱讀排行榜

          評論排行榜

          主站蜘蛛池模板: 旌德县| 中西区| 顺昌县| 象山县| 尉犁县| 丹阳市| 尼木县| 墨玉县| 崇礼县| 清河县| 安西县| 景泰县| 瑞丽市| 井研县| 泾阳县| 山东省| 会东县| 信丰县| 临漳县| 剑阁县| 三门县| 军事| 松滋市| 宁波市| 遂宁市| 斗六市| 射阳县| 湟源县| SHOW| 天等县| 夏河县| 门头沟区| 新余市| 德阳市| 清远市| 阆中市| 寿宁县| 昌图县| 怀仁县| 台东市| 信宜市|