<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
    主站蜘蛛池模板: 5555在线播放免费播放| 四虎影视在线永久免费观看| 亚洲综合伊人制服丝袜美腿| 国产精品色午夜视频免费看| 91免费国产视频| 亚洲乱人伦精品图片| 亚洲精品亚洲人成在线观看下载| av永久免费网站在线观看 | 亚洲熟女少妇一区二区| 亚洲w码欧洲s码免费| 亚洲精品色在线网站| 亚洲视频中文字幕| 国产嫩草影院精品免费网址| 最新国产乱人伦偷精品免费网站| 亚洲熟妇av午夜无码不卡| 久久亚洲高清观看| 国产在线98福利播放视频免费| 久久免费区一区二区三波多野| 亚洲AV无码专区亚洲AV桃| 亚洲AV无码一区二区二三区软件| 国产成人免费片在线观看| 久久国产免费观看精品3| 午夜在线免费视频 | 亚洲不卡无码av中文字幕| 亚洲精品视频在线观看免费| jizz在线免费播放| 亚洲日韩国产一区二区三区在线| 亚洲国产精品不卡在线电影| 亚洲AV网站在线观看| 人妻视频一区二区三区免费| 免费无码VA一区二区三区| g0g0人体全免费高清大胆视频| 亚洲精品无码高潮喷水A片软| 中文字幕亚洲精品资源网| 国产亚洲av片在线观看18女人| 妞干网免费视频在线观看| 59pao成国产成视频永久免费| 特级做A爰片毛片免费看无码| 免费无码国产在线观国内自拍中文字幕 | 久久久久久亚洲精品| 亚洲国产精品专区在线观看|