<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    xylz,imxylz

    關注后端架構、中間件、分布式和并發編程

       :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理 ::
      111 隨筆 :: 10 文章 :: 2680 評論 :: 0 Trackbacks

    從這一節開始正式進入線程池的部分。其實整個體系已經拖了很長的時間,因此后面的章節會加快速度,甚至只是一個半成品或者簡單化,以后有時間的慢慢補充、完善。

    其實線程池是并發包里面很重要的一部分,在實際情況中也是使用很多的一個重要組件。

    下圖描述的是線程池API的一部分。廣義上的完整線程池可能還包括Thread/Runnable、Timer/TimerTask等部分。這里只介紹主要的和高級的API以及架構和原理。

     

     

    ThreadPool2

     

    大多數并發應用程序是圍繞執行任務(Task)進行管理的。所謂任務就是抽象、離散的工作單元(unit of work)。把一個應用程序的工作(work)分離到任務中,可以簡化程序的管理;這種分離還在不同事物間劃分了自然的分界線,可以方便程序在出現錯誤時進行恢復;同時這種分離還可以為并行工作提供一個自然的結構,有利于提高程序的并發性。[1]

     

    并發執行任務的一個很重要前提是拆分任務。把一個大的過程或者任務拆分成很多小的工作單元,每一個工作單元可能相關、也可能無關,這些單元在一定程度上可以充分利用CPU的特性并發的執行,從而提高并發性(性能、響應時間、吞吐量等)。

    所謂的任務拆分就是確定每一個執行任務(工作單元)的邊界。理想情況下獨立的工作單元有最大的吞吐量,這些工作單元不依賴于其它工作單元的狀態、結果或者其他資源等。因此將任務盡可能的拆分成一個個獨立的工作單元有利于提高程序的并發性。

    對于有依賴關系以及資源競爭的工作單元就涉及到任務的調度和負載均衡。工作單元的狀態、結果或者其他資源等有關聯的工作單元就需要有一個總體的調度者來協調資源和執行順序。同樣在有限的資源情況下,大量的任務也需要一個協調各個工作單元的調度者。這就涉及到任務執行的策略問題。

    任務的執行策略包括4W3H部分:

    • 任務在什么(What)線程中執行
    • 任務以什么(What)順序執行(FIFO/LIFO/優先級等)
    • 同時有多少個(How Many)任務并發執行
    • 允許有多少個(How Many)個任務進入執行隊列
    • 系統過載時選擇放棄哪一個(Which)任務,如何(How)通知應用程序這個動作
    • 任務執行的開始、結束應該做什么(What)處理

    在后面的章節中會詳細分寫這些策略是如何實現的。我們先來簡單回答些如何滿足上面的條件。

    1. 首先明確一定是在Java里面可以供使用者調用的啟動線程類是Thread。因此Runnable或者Timer/TimerTask等都是要依賴Thread來啟動的,因此在ThreadPool里面同樣也是靠Thread來啟動多線程的。
    2. 默認情況下Runnable接口執行完畢后是不能拿到執行結果的,因此在ThreadPool里就定義了一個Callable接口來處理執行結果。
    3. 為了異步阻塞的獲取結果,Future可以幫助調用線程獲取執行結果。
    4. Executor解決了向線程池提交任務的入口問題,同時ScheduledExecutorService解決了如何進行重復調用任務的問題。
    5. CompletionService解決了如何按照執行完畢的順序獲取結果的問題,這在某些情況下可以提高任務執行的并發,調用線程不必在長時間任務上等待過多時間。
    6. 顯然線程的數量是有限的,而且也不宜過多,因此合適的任務隊列是必不可少的,BlockingQueue的容量正好可以解決此問題。
    7. 固定任務容量就意味著在容量滿了以后需要一定的策略來處理過多的任務(新任務),RejectedExecutionHandler正好解決此問題。
    8. 一定時間內阻塞就意味著有超時,因此TimeoutException就是為了描述這種現象。TimeUnit是為了描述超時時間方便的一個時間單元枚舉類。
    9. 有上述問題就意味了配置一個合適的線程池是很復雜的,因此Executors默認的一些線程池配置可以減少這個操作。

    線程池的基本策略大致就這些,從下一節開始就從線程池的基本原理和執行方法開始描述。

     

    [1] Java Concurrency in Practice

     



    ©2009-2014 IMXYLZ |求賢若渴
    posted on 2010-12-19 13:24 imxylz 閱讀(11961) 評論(5)  編輯  收藏 所屬分類: Java Concurrency

    評論

    # re: 深入淺出 Java Concurrency (28): 線程池 part 1 簡介 2010-12-19 14:06 yangwm
    總結思路很清晰。學習了。  回復  更多評論
      

    # Air Jordan 2010-12-19 16:55 Air Jordan
    I find myself coming to your blog more and more often to the point where my visits are almost daily now!
      回復  更多評論
      

    # re: 深入淺出 Java Concurrency (28): 線程池 part 1 簡介 2010-12-20 10:30 xiaoxin5230
    請問這個是圖是用什么工具生成的啊  回復  更多評論
      

    # re: 深入淺出 Java Concurrency (28): 線程池 part 1 簡介 2010-12-20 16:49 xylz
    @xiaoxin5230
    Mindmanager  回復  更多評論
      

    # re: 深入淺出 Java Concurrency (28): 線程池 part 1 簡介 2012-10-24 11:19 microsoft kernel
    so do i . it's very intersting ,Thank you   回復  更多評論
      


    ©2009-2014 IMXYLZ
    主站蜘蛛池模板: 国产精品美女自在线观看免费 | 亚洲人妖女同在线播放| 妻子5免费完整高清电视| 亚洲heyzo专区无码综合| 国产成人综合亚洲AV第一页| 免费视频精品一区二区三区 | 亚洲国产精品日韩在线观看 | 亚洲一卡2卡3卡4卡乱码 在线| 可以免费观看一级毛片黄a | 久久午夜夜伦鲁鲁片免费无码影视| 亚洲码和欧洲码一码二码三码| 亚洲日韩国产一区二区三区| 日韩在线播放全免费| 破了亲妺妺的处免费视频国产| 亚洲国产成人手机在线电影bd| 国产精品va无码免费麻豆| 中文字幕无码免费久久| 亚洲AV无码一区二区三区鸳鸯影院| 亚洲国产另类久久久精品黑人 | 在线永久免费的视频草莓| 色费女人18女人毛片免费视频| 久久亚洲熟女cc98cm| 亚洲AV无码成H人在线观看| 中国人xxxxx69免费视频| 日韩亚洲翔田千里在线| 亚洲色图.com| 亚洲人成中文字幕在线观看| 成全视频免费高清 | 午夜a级成人免费毛片| 久久免费视频99| 一级做性色a爰片久久毛片免费| 亚洲一区精品视频在线| 国产V亚洲V天堂无码久久久| 久久国产乱子精品免费女| 亚洲AV网一区二区三区 | 亚洲精品国产精品国自产网站 | 亚洲不卡1卡2卡三卡2021麻豆| 亚洲人成图片小说网站| 亚洲日韩精品无码专区网站 | 久久精品国产亚洲AV大全| 免费观看AV片在线播放|