<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
    主站蜘蛛池模板: 女人张开腿给人桶免费视频| 男女免费观看在线爽爽爽视频 | 麻豆亚洲AV成人无码久久精品| 亚洲免费福利视频| 亚洲国产韩国一区二区| 0588影视手机免费看片| 亚洲一欧洲中文字幕在线| 最近2019中文字幕mv免费看| 亚洲中文字幕日本无线码| 精品国产麻豆免费网站| 国产成人亚洲精品蜜芽影院| 亚洲AV无码乱码精品国产| 久久九九免费高清视频| 无码专区—VA亚洲V天堂| 免费能直接在线观看黄的视频| 亚洲videos| 日韩精品电影一区亚洲| 中文字幕永久免费| 久久精品国产亚洲AV嫖农村妇女| 2021精品国产品免费观看| 亚洲人和日本人jizz| 日本特黄特色aa大片免费| jizz免费在线观看| 久久久亚洲欧洲日产国码二区| 台湾一级毛片永久免费| 国产精品亚洲专区在线播放| 亚洲人精品午夜射精日韩| 久久国产高潮流白浆免费观看 | 看成年女人免费午夜视频| 亚洲线精品一区二区三区影音先锋| 中文字幕无码日韩专区免费| 亚洲w码欧洲s码免费| 久久久久久久亚洲精品| 每天更新的免费av片在线观看 | 亚洲一区二区三区在线网站 | 99精品热线在线观看免费视频| 学生妹亚洲一区二区| 国产亚洲自拍一区| 免费毛片在线看片免费丝瓜视频| 一级特黄色毛片免费看| 亚洲婷婷天堂在线综合|