Java并發(fā)編程基礎(chǔ)知識(shí)片段

          Java 5并發(fā)包的加入,給Java的并發(fā)程序的開(kāi)發(fā)帶來(lái)了很多的好處,在此列舉一些并發(fā)編程中應(yīng)該掌握的一些基礎(chǔ)知識(shí)片斷,這些片斷基本都是由一些問(wèn)題組成,在片段中沒(méi)有直接寫(xiě)出答案,由于可用來(lái)解決這些片段的方法還是很多的,因此只是提到了解決問(wèn)題可選方案的關(guān)鍵字,如果有需要進(jìn)一步了解的話(huà),基本上google一下應(yīng)該就能查出來(lái)了,不過(guò)就像之前有朋友說(shuō)的,如果不是經(jīng)常用的話(huà),其實(shí)就算現(xiàn)在知道了也是會(huì)忘記的,這很正常,:),不過(guò)我更認(rèn)為那是因?yàn)橹淙欢恢渌匀辉斐傻模芏鄸|西如果知道原理的話(huà),基本上還是可以記得很長(zhǎng)一段時(shí)間的。
          片斷一
          在main中啟動(dòng)兩個(gè)線程,例如:
              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");
          在這樣的方式下,執(zhí)行時(shí)會(huì)出現(xiàn)什么樣的效果;
          怎么樣才能保證字符串的打印順序是:"Call B"-->"Call A"-->"execute here"呢?(提示:join、wait/notify、Semphore、Lock等)
          在做到了上面打印順序控制后,怎么樣才能做到如果線程b執(zhí)行了100毫秒還沒(méi)執(zhí)行完的話(huà)則直接繼續(xù)線程a的執(zhí)行呢?(提示:ExecutorServices、Future)
          片段二
          也是個(gè)控制順序的問(wèn)題,假設(shè)有如下一段代碼:
          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");
          需要做到所有線程同時(shí)運(yùn)行,而不是按照f(shuō)or的順序一個(gè)一個(gè)啟動(dòng),并且要求All Executed需要在所有線程都執(zhí)行完畢后才打印,有什么辦法做到呢?(提示: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;
          }
          上面這段代碼在并發(fā)時(shí)會(huì)出什么問(wèn)題呢,為什么?
          如果有問(wèn)題的話(huà),應(yīng)該怎么去解決呢?(提示:Synchronized、Lock、FutureTask等)
          片段四
          ThreadPoolExecutor executor=new ThreadPoolExecutor(10,100,60L,TimeUnit.SECONDS,new LinkedBlockingQueue<Runnable>(20),new ThreadPoolExecutor.AbortPolicy());
          一個(gè)這樣的線程池,當(dāng)并發(fā)請(qǐng)求數(shù)為15時(shí)會(huì)是怎么個(gè)狀況?(池的使用狀況,例如活動(dòng)線程數(shù)、隊(duì)列中的數(shù)等)
          當(dāng)并發(fā)請(qǐng)求數(shù)為100的時(shí)候是什么狀況?
          當(dāng)并發(fā)請(qǐng)求數(shù)為200的時(shí)候是什么狀況?
          當(dāng)30秒內(nèi)不再有請(qǐng)求時(shí)會(huì)怎么樣?
          當(dāng)2分鐘內(nèi)沒(méi)有請(qǐng)求時(shí)會(huì)怎么樣?
          如果換成以下方式初始化池又會(huì)怎么樣呢:
          ThreadPoolExecutor executor=new ThreadPoolExecutor(10,150,20L,TimeUnit.SECONDS,new SynchronousQueue<Runnable>(),new ThreadPoolExecutor.AbortPolicy());
          片段五
          怎么查看jvm中線程的執(zhí)行狀況,線程的狀態(tài)有哪幾種,分別表示什么含義?
          ThreadFactory有什么用?
          如果要捕捉線程中拋出的異常,可以怎么做呢?
          如果TimerTask拋出運(yùn)行時(shí)異常會(huì)不會(huì)影響到同一個(gè)Timer中其他的TimerTask的執(zhí)行呢,SchedularThreadPoolExecutor和Timer有什么不同?
          片段六
          常見(jiàn)的一個(gè)例子:
          private int count;
          public synchronized int getNext(){
              return count++;
          }
          在JDK5有什么別的方法來(lái)進(jìn)行實(shí)現(xiàn)嗎?
          像JDK5中的AtomicInteger的incrementAndGet是怎么實(shí)現(xiàn)的呢?
          如果這個(gè)count要按線程來(lái)獨(dú)立管理,即每個(gè)線程有自己的一個(gè)count,要怎么做呢?

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

          評(píng)論

          # re: Java并發(fā)編程基礎(chǔ)知識(shí)片段 2008-06-25 14:36 鄧芝

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

          # re: Java并發(fā)編程基礎(chǔ)知識(shí)片段 2008-06-25 17:32 BlueDavy

          @鄧芝
          好事呀,就應(yīng)該把你的經(jīng)驗(yàn)也給大家多分享分享的。  回復(fù)  更多評(píng)論   

          # re: Java并發(fā)編程基礎(chǔ)知識(shí)片段 2008-07-09 20:37 網(wǎng)站建設(shè)

          只能說(shuō)session用的時(shí)候要非常注意吧,  回復(fù)  更多評(píng)論   

          # re: Java并發(fā)編程基礎(chǔ)知識(shí)片段[未登錄](méi) 2008-08-12 11:25 kruce

          片斷3你想鎖住整個(gè)Map對(duì)象么?
          貌似不可取
          Callable, Future, FutureTask, putIfAbsent  回復(fù)  更多評(píng)論   

          公告

           









          feedsky
          抓蝦
          google reader
          鮮果

          導(dǎo)航

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

          統(tǒng)計(jì)

          隨筆分類(lèi)

          隨筆檔案

          文章檔案

          Blogger's

          搜索

          最新評(píng)論

          閱讀排行榜

          評(píng)論排行榜

          主站蜘蛛池模板: 会理县| 二手房| 蓬莱市| 张家界市| 龙口市| 利津县| 红安县| 枝江市| 西乡县| 治多县| 滦南县| 宜兰县| 铜梁县| 黄山市| 和林格尔县| 广汉市| 旌德县| 博客| 孟州市| 漳浦县| 迭部县| 丰城市| 柯坪县| 崇仁县| 色达县| 海淀区| 汉沽区| 阜宁县| 湖口县| 北海市| 大新县| 金昌市| 原平市| 体育| 迁西县| 罗城| 盐边县| 临安市| 河津市| 望都县| 陆良县|