標籤:管理 ble top fifo 串列 實現 時間 線上 data-
一、 線上程中運行任務
無限制建立線程的不足.線程生命週期的開銷很高.資源消耗.穩定性
二、Executor架構Executor基於生產者-消費者模式,提交任務的操作相當於生產者。運行任務的線程則相當於消費者。
1. Executors 返回 ExecutorService
2. ExecutorService方法submit、execute
3. ExecutorService.submit 返回 Future
線程池,Executors方法介紹
| 方法名 |
解釋 |
| newFixedThreadPool |
將建立一個固定長度的線程池,每當提交一個任務時就建立一個線程,知道達到線程池的最大數量。這時線程池的規模將不再變化(假設某個線程因為發生了未預期的Exception而結束,那麼線程池會補充一個新的線程。) |
| newCachedThreadPool |
將建立一個可快取的線程池,假設線程池的當前規模超過了處理需求時。那麼將回收空暇的線程。而當需求添加時,則能夠加入新的線程,線程池的規模不存在不論什麼限制。 |
| newSingleThreadExecutor |
將會建立一個單線程的Executor。它建立單個工作者線程來運行任務,假設這個線程異常結束,會建立還有一個線程來替代。newSingleThreadExecutor能確保按照任務在隊列中的順序來串列運行(比如FIFO、LIFO、優先順序) |
| newScheduledThreadPool |
建立了一個固定長度的線程池,並且以延遲或定時的方式來運行任務,類似於Timer。 |
Executor的生命週期
以上四個方法都會返回ExecutorService,ExecutorService的生命週期有3種狀態:執行、關閉和已終止。
| 方法名 |
解釋 |
| shutdown |
將運行平緩的關閉過程:不再接受新的任務。同一時候等待已經提交的任務運行完畢—包含那些還未開始啟動並執行任務。 |
| shutdownNow |
將運行粗暴的關閉過程:它將嘗試取消全部運行中的任務,而且不再啟動隊列中尚未開始啟動並執行任務。 |
Timer類負責管理延遲任務
三、找出可利用的並行性1. 任務拆分到多個子線程處理。2. 攜帶結果的任務Callable與Futrue
Executor運行任務的4個生命週期:建立。提交。開始。完畢。
任務的提交者和運行者之間的通訊手段
ExecutorService executor = Executors.newSingleThreadExecutor();Callable<Object> task = new Callable<Object>() { public Object call() throws Exception { Object result = "..."; return result; }};Future<Object> future = executor.submit(task);future.get(); // 等待至完畢Future<Object> future = executor.submit(task);// 等待到任務被運行完畢返回結果// 假設任務運行出錯,這裡會拋ExecutionExceptionfuture.get();//等待3秒,逾時後會拋TimeoutExceptionfuture.get(3, TimeUnit.SECONDS);Callable<Object> task = new Callable<Object>() { public Object call() throws Exception { Object result = …; return result; }};
有兩種任務:
Runnable
Callable - 須要返回值的任務
Task Submitter把任務提交給Executor運行,他們之間須要一種通訊手段,這樣的手段的詳細實現。通常叫做Future。
Future通常包含get(堵塞至任務完畢)。 cancel。get(timeout)(等待一段時間)
等等。Future也用於非同步變同步的情境。
3、4. 在異構任務並行化中存在的局限假設一個任務是讀取IO資源。能夠使用多個線程去同一時候讀取。可是效率上限可能出在IO上。即使開啟再多線程讀取總速度也不可能超出IO讀取速度上限。
開啟多個線程本身也會調高編程難度,同一時候開啟多個線程也會造成資源消耗。多線程提高效率非常多時候並非添加一個線程效率提高一倍,可能提高的效率微乎其微。
5. Executor與BlockingQueue假設想提交一組計算任務,而且希望在計算完畢後獲得結果,能夠使用BlockingQueue儲存每一個任務的Future。
7. 為任務設定時限//等待3秒,逾時後會拋TimeoutException
future.get(3, TimeUnit.SECONDS);
8. ExecutorService.invokeAll()
運行給定的任務,當全部任務完畢時。返回保持任務狀態和結果的 Future 列表。返回列表的全部元素的 Future.isDone() 為 true。
注意,能夠正常地或通過拋出異常來終止已完畢 任務。假設進行中此操作時改動了給定的 collection,則此方法的結果是不確定的。
四、資料:《溫紹錦 - Java並發程式設計教程》 摘錄“任務的提交者和運行者”。“任務的提交者和運行者之間的通訊手段”
聊聊並發(三)——JAVA線程池的分析和使用(原理)
http://www.infoq.com/cn/articles/java-threadPool
Java(Android)線程池(使用)
http://www.trinea.cn/android/java-android-thread-pool/
Java Thread Pool Example using Executors and ThreadPoolExecutor
http://www.journaldev.com/1069/java-thread-pool-example-using-executors-and-threadpoolexecutor
工具能夠查看線程數
jconsole.exe
《Java並發編程實戰》第六章 任務運行 讀書筆記