1. 程式人生 > >Java中的命令模式——Thread,ThreadPoolExecutor和Runnable

Java中的命令模式——Thread,ThreadPoolExecutor和Runnable

1. 命令模式是什麼:

定義理解:命令模式最大的特性就在於將請求封裝成抽象,也就是“命令”,並可以提供命令佇列(可選的),支援排隊、撤銷等功能。 分類:行為型設計模式; 優點: (1)將請求抽象,可以動態的擴充套件請求的型別; (2)將呼叫程式碼和接收執行的程式碼分離開來,用“命令”這個第三方進行解耦; (3)可以方便對對命令進行管理:提供佇列,日誌,撤銷,重做等等額外的功能; 缺點: 將命令抽象出來可能會導致需要過多的具體命令實現; 對比: 與策略模式:從形式上看,有些命令模式的實現方式,比如Thread和runnable好像和策略模式的形式更為接近,但Thread和Runnable是命令模式的實現原因在於“Invoker”呼叫者。Thread是一個呼叫者,它提供了start,join,interrupt等等方法讓我們來控制“命令”也就是Runnable的執行。而Receiver則是讓程式設計師可以自由與Runnale組合的抽象。 策略模式並沒有Invoker,它僅僅是向Context物件傳遞一個策略實現; 下圖展示了一個基本的命令模式包括的內容:

2. Java中命令模式的應用:

我覺得與一些我們常用的具體的工具結合起來對理解命令模式是一種更好的方式:下面列舉幾個Java核心類中命令模式的應用:

執行緒池和Runnable:

前面說了Thread和Runnable,不過我覺得用ThreadPoolExecutor能更深入的說明命令模式的強大之處。 PS: ThreadPoolExecutor是Java中執行緒池的實現類,Executors工具類中有多個它的工廠方法(newFixedThreadPool等),本身池的思想是享元模式的應用,這裡實際上JDK通過ThreadPoolExecutor使得客戶端程式碼和Thread解耦,我們不需要再直接控制Thread的了(ThreadPoolExecutor可以通過設定ThreadFactory定製Thread)。不過這不是本文的主題,在此不對它深入說明。 下圖包含了5個類或介面: ThreadPoolExecutor:呼叫者,它持有了一個命令佇列,客戶端程式碼可以向它提交要執行的任務(命令); BlockingQueue:任務阻塞佇列,它實際上就是模式中的“命令佇列”; Runnable:任務抽象,也就是“命令”; ConcreteRunnable:具體的任務類,它持有一個Receiver; Receiver:被呼叫者,也就是具體做事情的人,不過在具體的應用時,常常會將Runnable實現類直接實現具體的邏輯和這個角色有重合,不過設計模式重點在於結合場景並不是教條,不用糾結於此。

相關推薦

Java命令模式——ThreadThreadPoolExecutorRunnable

1. 命令模式是什麼: 定義理解:命令模式最大的特性就在於將請求封裝成抽象,也就是“命令”,並可以提供命令佇列(可選的),支援排隊、撤銷等功能。 分類:行為型設計模式; 優點: (1)將請求抽象,可以動態的擴充套件請求的型別; (2)將呼叫程式碼和接收執行的程式碼分離開來,用“命令”這個第三方進行解耦;

JAVA的關鍵字staticfinalconst

一、static1.static修飾變數C的區域性變數,全域性變數(即外部變數)和靜態變數區域性變數:在函式內定義的變數,採用動態儲存方式。全域性變數:在函式外定義的變數,採用靜態儲存方式。extern

初識Java的四大執行緒池ThreadPoolExecutor的使用(歡迎指正)

初識Java中的四大執行緒池和ThreadPoolExecutor的使用(轉載+自身心得) 為什麼用執行緒池? 1.建立/銷燬執行緒伴隨著系統開銷,過於頻繁的建立/銷燬執行緒,會很大程度上影響處-理效率; 2.執行緒併發數量過多,搶佔系統資源從而導致阻塞; 3.對執行緒進行一些簡單的

Java取得陣列(array)集合(Collection)字串(String)的長度

在使用Java程式設計時,我們經常需要取得陣列,集合或者字串的長度來作為迴圈或其他操作的條件。為了便於複習,在此總結一下取得他們長度的方法,以免混淆。 先給結論。 1. 陣列(array) 使用.length來獲取陣列的長度。 2. 集合(Collec

Java的強引用軟引用弱引用虛引用

從JDK1.2版本開始,把物件的引用分為四種級別,從而使程式能更加靈活的控制物件的生命週期。這四種級別由高到低依次為:強引用、軟引用、弱引用和虛引用。 一、強引用 如果一個物件具有強引用,那就類似於必不可少的生活用品,垃圾回收器絕不會回收它。當記憶體空 間不足,Java虛

java繼承的理解super關鍵字方法的重寫過載以及注意事項理解

一、類的繼承理解 在java中類的繼承是指:在一個現有類的基礎之上去構建一個新的類,構建出來的新的類被稱為子類,現有類是父類,子類會自動擁有父類所有可繼承的屬性和方法。繼承類是現有類的更具體一些,繼承類可能只擁有一部分父類的屬性和方法。 如圖,這就表示了繼承類是父類的一種更具體形式

Java100以內同時被35整除的數輸出

package com.myhomework; //作者:陳天祥 //時間:2016.10.8 //功能:100以內同時被3和5整除的數,輸出 public class Text2 {public s

java使用JSCH包SFTP及SSH2檔案操作及遠端命令執行

SFTPConstants.java,定義我們需要使用的一些引數名稱: public class SFTPConstants { public static final String SFTP_REQ_HOST = "host"; public static

java工廠模式單例模式詳解

如何將例項化具體類的程式碼從應用中抽離或者封裝起來,使它們不會干擾應用的其他部分? 1:簡單工廠模式:其作用是例項化物件而不需要客戶瞭解這個物件屬於那個具體的子類。 using System; using System.Collections; public class MyClass {  

java程序間通訊基於檔案共享記憶體

附上編譯執行的原始碼: 1,請分別建立兩個工程來進行讀寫操作; 2,請在相應的目錄建立一個檔案例如:/home/tory/workspace/sharedMemory.txt 3,往檔案中輸入超過12個位元組資料:echo asldkjasldkddas > /hom

java遍歷實體類屬性型別屬性值

[java] view plain copy print? publicstaticvoid testReflect(Object model) throws NoSuchMethodException, IllegalAccessException, IllegalArgumentExcept

JAVA學習】java==、equals()、hashCode()都物件的比較有關java這三者各有什麼用處呢java為什麼需要設計這三種物件的比較方法呢?

關於hashCode() 為什麼會設計hashCode()方法?    hashCode()方法返回的就是一個數值,我們稱之為hashCode吧。從方法的名稱上就可以看出,其目的是生成一個hash碼。hash碼的主要用途就是在對物件進行雜湊的時候作為key輸入,據此很容易推斷出,我們需要每個物件的ha

# Java遍歷Object的屬性屬性值並以String形式返回||toString()一個物件Object||將一個物件轉化為字串String

Java中遍歷Object的屬性和屬性值,並以String形式返回||toString()一個物件Object||將一個物件轉化為字串String 1.關注每個屬性組 //用List<Map<String, String>>

Java的線程狀態轉換線程控制常用方法

img sta () throw line star height style 技術 Java 中的線程狀態轉換:    【註】:不是 start 之後就立刻開始執行, 只是就緒了(CPU 可能正在運行其他的線程). 【註】:只有被 CPU 調度之後,線程才開始執行, 當

Java的文件上傳下載

獲取 https res 文件內容 tty type() val name 表單 文件上傳原理:   早期的文件上傳機制:     在TCP/IP中。最早出現的文件上傳機制是FTP。他是將文件由客戶端發送到服務器的標準機制。   jsp中的文件上傳機制:     在jsp編

java的數據類型運算符的總結歸類。

等等 宋體 表示 參數 強制轉換 賦值運算 對象 強制 特點 首先學習java肯定先要了解java的發展史,以及java的特點,常見的dos命令,jdk的安裝,如何開發java程序等等一下概念行的東西,這裏面我都不一一說了。 今天這一章主要想總結一下java中的數據類型和運

javaExecutor、ExecutorService、ThreadPoolExecutor介紹

cut .net mil col 20px 介紹 bsp tex exe java中Executor、ExecutorService、ThreadPoolExecutor介紹 ExecutorService 的理解與使用 java中Executor、ExecutorSer

java什麽是序列化反序列化

zab question .com 程序 還原 破壞 ans 但我 實現 序列化:能夠把一個對象用二進制的表示出來。 類似我第一個字節表示什麽屬性名詞,第二個字節表示什麽屬性值,第幾個字段表示有幾個屬性等。 而且這個二進制可以寫到硬

Java的內存處理機制final、static、final static總結

stat 入口 引用類型 堆棧 class a 如果 虛擬 不同 bsp Java中的內存處理機制和final、static、final static總結 裝載自:http://blog.csdn.net/wqthaha/article/details/209235

javaString的equals() ==

spa 相等 println div 說明 java pri equal new 1 String a=new String("java"); 2 String b=new String("java"); 3 Syst