1. 程式人生 > >Java多執行緒--非同步執行框架Executor

Java多執行緒--非同步執行框架Executor

Eexecutor作為靈活且強大的非同步執行框架,其支援多種不同型別的任務執行策略,提供了一種標準的方法將任務的提交過程和執行過程解耦開發,基於生產者-消費者模式,其提交任務的執行緒相當於生產者,執行任務的執行緒相當於消費者,並用Runnable來表示任務,Executor的實現還提供了對生命週期的支援,以及統計資訊收集,應用程式管理機制和效能監視等機制。 1.Exexctor簡介 Executor的UML圖:(常用的幾個介面和子類) Executor:一個介面,其定義了一個接收Runnable物件的方法executor,其方法簽名為executor(Runnable command), ExecutorService:是一個比Executor使用更廣泛的子類介面,其提供了生命週期管理的方法,以及可跟蹤一個或多個非同步任務執行狀況返回Future的方法 AbstractExecutorService:ExecutorService執行方法的預設實現 ScheduledExecutorService
:一個可定時排程任務的介面 ScheduledThreadPoolExecutor:ScheduledExecutorService的實現,一個可定時排程任務的執行緒池 ThreadPoolExecutor:執行緒池,可以通過呼叫Executors以下靜態工廠方法來建立執行緒池並返回一個ExecutorService物件2.ThreadPoolExecutor建構函式的各個引數說明 ThreadPoolExecutor方法簽名: 複製程式碼
public ThreadPoolExecutor(int corePoolSize,
                          int
maximumPoolSize, long keepAliveTime, TimeUnit unit, BlockingQueue<Runnable> workQueue, ThreadFactory threadFactory, RejectedExecutionHandler handler) //後兩個引數為可選引數
複製程式碼 引數說明:
corePoolSize:核心執行緒數,如果執行的執行緒少於corePoolSize,則建立新執行緒來執行新任務,即使執行緒池中的其他執行緒是空閒的 maximumPoolSize:最大執行緒數,可允許建立的執行緒數,corePoolSize和maximumPoolSize設定的邊界自動調整池大小: corePoolSize <執行的執行緒數< maximumPoolSize:僅當佇列滿時才建立新執行緒 corePoolSize=執行的執行緒數= maximumPoolSize:建立固定大小的執行緒池 keepAliveTime:如果執行緒數多於corePoolSize,則這些多餘的執行緒的空閒時間超過keepAliveTime時將被終止 unit:keepAliveTime引數的時間單位 workQueue:儲存任務的阻塞佇列,與執行緒池的大小有關:   當執行的執行緒數少於corePoolSize時,在有新任務時直接建立新執行緒來執行任務而無需再進佇列   當執行的執行緒數等於或多於corePoolSize,在有新任務新增時則選加入佇列,不直接建立執行緒   當佇列滿時,在有新任務時就建立新執行緒 threadFactory:使用ThreadFactory建立新執行緒,預設使用defaultThreadFactory建立執行緒 handle:定義處理被拒絕任務的策略,預設使用ThreadPoolExecutor.AbortPolicy,任務被拒絕時將丟擲RejectExecutorException 3.Executors:提供了一系列靜態工廠方法用於建立各種執行緒池    newFixedThreadPool:建立可重用且固定執行緒數的執行緒池,如果執行緒池中的所有執行緒都處於活動狀態,此時再提交任務就在佇列中等待,直到有可用執行緒;如果執行緒池中的某個執行緒由於異常而結束時,執行緒池就會再補充一條新執行緒。 方法簽名:
public static ExecutorService newFixedThreadPool(int nThreads) {
    return new ThreadPoolExecutor(nThreads, nThreads,
                                  0L, TimeUnit.MILLISECONDS,
                                  //使用一個基於FIFO排序的阻塞佇列,在所有corePoolSize執行緒都忙時新任務將在佇列中等待
                                  new LinkedBlockingQueue<Runnable>());
}
   newSingleThreadExecutor:建立一個單執行緒的Executor,如果該執行緒因為異常而結束就新建一條執行緒來繼續執行後續的任務 方法簽名: 複製程式碼
public static ExecutorService newSingleThreadExecutor() {
   return new FinalizableDelegatedExecutorService
                     //corePoolSize和maximumPoolSize都等於,表示固定執行緒池大小為1
                        (new ThreadPoolExecutor(1, 1,
                                                0L, TimeUnit.MILLISECONDS,
                                                new LinkedBlockingQueue<Runnable>()));
}
複製程式碼    newScheduledThreadPool:建立一個可延遲執行或定期執行的執行緒池 方法簽名: 例1:(使用newScheduledThreadPool來模擬心跳機制) 複製程式碼
 1 public class HeartBeat {
 2     public static void main(String[] args) {
 3         ScheduledExecutorService executor = Executors.newScheduledThreadPool(5);
 4         Runnable task = new Runnable() {
 5             public void run() {
 6                 System.out.println("HeartBeat.........................");
 7             }
 8         };
 9         executor.scheduleAtFixedRate(task,5,3, TimeUnit.SECONDS);   //5秒後第一次執行,之後每隔3秒執行一次
10     }
11 }
複製程式碼 輸出:
HeartBeat....................... //5秒後第一次輸出
HeartBeat....................... //每隔3秒輸出一個
   newCachedThreadPool:建立可快取的執行緒池,如果執行緒池中的執行緒在60秒未被使用就將被移除,在執行新的任務時,當執行緒池中有之前建立的可用執行緒就重      用可用執行緒,否則就新建一條執行緒 方法簽名:
public static ExecutorService newCachedThreadPool() {
    return new ThreadPoolExecutor(0, Integer.MAX_VALUE,
                                  60L, TimeUnit.SECONDS,
                                  //使用同步佇列,將任務直接提交給執行緒
                                  new SynchronousQueue<Runnable>());
}
例2:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 public class ThreadPoolTest { public static void main(String[] args) throws InterruptedException { ExecutorService threadPool = Executors.newCachedThreadPool();//執行緒池裡面的執行緒數會動態變化,並可線上程線被移除前重用 for (int i = 1; i <= 3; i ++) { final  int task = i;   //10個任務 //TimeUnit.SECONDS.sleep(1); threadPool.execute(new Runnable() {    //接受一個Runnable例項 public void run() {

相關推薦

Java執行--非同步執行框架Executor

Eexecutor作為靈活且強大的非同步執行框架,其支援多種不同型別的任務執行策略,提供了一種標準的方法將任務的提交過程和執行過程解耦開發,基於生產者-消費者模式,其提交任務的執行緒相當於生產者,執行任務的執行緒相當於消費者,並用Runnable來表示任務,Execu

Java執行程式設計---併發框架Executor

        我們都知道,在JDK1.5之前,Java中要進行業務併發時,通常需要有程式設計師獨立完成程式碼實現,而當針對高質量Java多執行緒併發程式設計時,為防止死鎖等現象的出現,比如使用java之前的wait()、notify()和synchronized等,每每需要

《Unity 3D遊戲客戶端基礎框架執行非同步 Socket 框架構建

引言: 之前寫過一個 demo 案例大致講解了 Socket 通訊的過程,並和自建的伺服器完成連線和簡單的資料通訊,詳細的內容可以檢視 Unity3D —— Socket通訊(C#)。但是在實際專案應用的過程中,這個 demo 的實現方式顯得異常簡陋,而且對應

如何在java中獲取執行非同步執行之後的結果

java中提供了Future<V>介面和實現了Future介面的FutureTask<V> 類來將執行緒執行之後的結果返回(通過get()方法)。 1.Future<V>介面 Runnable介面執行任務是不返回任何值的,Runnable

spring 執行非同步執行

多執行緒併發處理起來通常比較麻煩,如果你使用spring容器來管理業務bean,事情就好辦了多了。spring封裝了Java的多執行緒的實現,你只需要關注於併發事物的流程以及一些併發負載量等特性,具體來說如何使用spring來處理併發事務: 1.瞭解 TaskExecutor介面 Spring的TaskEx

EventBus回撥,獲取執行非同步執行之後的結果

問題來源:最近的專案中涉及到WebView的開發,檢查專案模組來自於SQLite,因為專案太多,如果獲取資料不使用LitePal非同步獲取,在頁面之前的跳轉會產生短暫的卡頓。(LitePal預設操作SQLite是在主執行緒中進行的,資料不多影響不大,資料太多的時候會造成UI卡

C# 實現的執行非同步Socket資料包接收器框架

幾天前在博問中看到一個C# Socket問題,就想到筆者2004年做的一個省級交通流量接收伺服器專案,當時的基本求如下: 接收自動觀測裝置通過無線網絡卡、Internet和Socket上報的交通量資料包 全年365*24執行的自動觀測裝置5分鐘上報一次觀測資料,每筆記錄約

Java執行--併發集合框架概述

最近被陸陸續續問了幾遍HashMap的實現,回答的不好,打算複習複習JDK中的集合框架,並嘗試分析其原始碼,這麼做一方面是這些類非常實用,掌握其實現能更好的優化我們的程式;另一方面是學習借鑑JDK是如何實現了這麼一套優雅高效的類庫,提升程式設計能力。 在介紹具體適合類之

Java執行執行安全與非同步執行

多執行緒併發修改一個數據結構,很容易破壞這個資料結構,如散列表。鎖能夠保護共享資料結構,但選擇執行緒安全的實現更好更容易,如阻塞佇列就是執行緒安全的集合。 執行緒安全的集合 Vector和HashTable類提供了執行緒安全的動態陣列和散列表,而ArrayList和H

執行引發執行安全問題的考慮和在javaWEB專案及SSM框架java專案中的場景分析

    當今世界是一個快速發展的社會,快速發展的好處就是我們不需要了解汽車原理,不需要知道怎麼樣去造輪子,只要你有錢,你就可以享用這一切。     多執行緒的問題在我們初學者的世界裡就顯得尤為突出,看似不合理卻又合理的一個現象時,我們在初學java時多會接觸多

可擴充套件執行非同步Socket伺服器框架EMTASS 2.0

0 前言 >>[前言]、[第1節]、[第2節]、[第3節]、[第4節]、[第5節]、[第6節] 在程式設計與實際應用中,Socket資料包接收伺服器夠得上一個經典問題了:需要計算機與網路程式設計知識(主要是Socket),與業務處理邏輯密切(如:包組成

JAVA執行(三) 執行池和鎖的深度化

 github演示程式碼地址:https://github.com/showkawa/springBoot_2017/tree/master/spb-demo/src/main/java/com/kawa/thread 1.執行緒池  1.1 執行緒池是什麼 Java中的執行緒

java執行2.執行安全之可見性

要編寫正確的併發程式,關鍵在於:在訪問共享的可變狀態時需要進行正確的管理 可見性: 同步的另一個重要目的——記憶體可見性。 我們不僅希望防止某個執行緒正在使用物件狀態而另一個執行緒同時在修改狀態,而且希望當一個執行緒修改了物件狀態後,其他執行緒能夠看到發生的狀態變化(互斥訪問/通訊效果

java執行執行協作

也是網上看的一道題目:關於假如有Thread1、Thread2、Thread3、Thread4四條執行緒分別統計C、D、E、F四個盤的大小,所有執行緒都統計完畢交給Thread5執行緒去做彙總,應當如何實現? 蒐集整理了網上朋友提供的方法,主要有: 1. 多執行緒都是Thread或

Java執行執行狀態、執行池狀態

執行緒狀態:     執行緒共包括以下5種狀態。1. 新建狀態(New)  執行緒物件被建立後,就進入了新建狀態。例如,Thread thread = new Thread()。2. 就緒狀態(Runnable)  也被稱為“可執行狀態”。執行緒物件被建立後,

利用web work實現執行非同步機制,打造頁面單步除錯IDE

我們已經完成了整個編譯器的開發,現在我們做一個能夠單步除錯的頁面IDE,完成本章程式碼後,我們可以實現下面如圖所示功能: 頁面IDE可以顯示每行程式碼所在的行,單擊某一行,在改行前面會出現一個紅點表示斷點,點選Parsing按鈕後,進入單步除錯模式,然後每點一次step按鈕,頁

執行非同步操作日誌

上次寫的一篇部落格,多執行緒非同步操作日誌不完整,現在寫一個完整的 功能是:使用者訪問一個controller,將訪問的記錄儲存到佇列中去,在開啟定時器,消費掉記錄儲存到檔案中(可改為儲存到資料庫) 我的idea目錄: controller中的程式碼: package com.

【python3】執行-執行非同步(推薦使用)

- python3有threading和_thread兩種執行緒寫法,推薦使用threading。 開多執行緒就是為了使用多執行緒的非同步能力來同時執行多個執行緒。 1. threading方法 #!/usr/bin/python3 # 執行緒非同步 import thread

Java執行池的實現--Executor、ThreadPoolTaskExecutor、@Async的使用

一、為什麼要使用執行緒池 當我們需要的併發執行執行緒數量很多時,且每個執行緒執行很短的時間就結束了,這樣,我們頻繁的建立、銷燬執行緒就大大降低了工作效率(建立和銷燬執行緒需要時間、資源)。java中的執行緒池可以達到這樣的效果:一個執行緒執行完任務之後,繼續去執行下一個任務,

Java執行-併發之如何制定執行執行順序?

文章目錄 如何讓10個執行緒按照順序列印0123456789? 程式碼如下: 1.建立一個鎖物件類 2.建立一個執行緒類 3.測試類 如何讓10個執行緒按照順序列印012