㈠ 常見的非同步,同步,多線程,跨進程,組件,容器的設計方法有哪些
C#中非同步和多線程的區別是什麼呢?非同步和多線程兩者都可以達到避免調用線程阻塞的目的,從而提高軟體的可響應性。甚至有些時候我們就認為非同步和多線程是等同的概念。但是,非同步和多線程還是有一些區別的。而這些區別造成了使用非同步和多線程的時機的區別。
非同步和多線程的區別之非同步操作的本質
所有的程序最終都會由計算機硬體來執行,所以為了更好的理解非同步操作的本質,我們有必要了解一下它的硬體基礎。 熟悉電腦硬體的朋友肯定對DMA這個詞不陌生,硬碟、光碟機的技術規格中都有明確DMA的模式指標,其實網卡、音效卡、顯卡也是有DMA功能的。DMA就是直 接內存訪問的意思,也就是說,擁有DMA功能的硬體在和內存進行數據交換的時候可以不消耗CPU資源。只要CPU在發起數據傳輸時發送一個指令,硬體就開 始自己和內存交換數據,在傳輸完成之後硬體會觸發一個中斷來通知操作完成。這些無須消耗CPU時間的I/O操作正是非同步操作的硬體基礎。所以即使在DOS 這樣的單進程(而且無線程概念)系統中也同樣可以發起非同步的DMA操作。
非同步和多線程的區別之線程的本質
線程不是一個計算機硬體的功能,而是操作系統提供的一種邏輯功能,線程本質上是進程中一段並發運行的代碼,所以線程需要操作系統投入CPU資源來運行和調度。
非同步和多線程的區別之非同步操作的優缺點
因為非同步操作無須額外的線程負擔,並且使用回調的方式進行處理,在設計良好的情況下,處理函數可以不必使用共享變數(即使無法完全不用,最起碼可以減少 共享變數的數量),減少了死鎖的可能。當然非同步操作也並非完美無暇。編寫非同步操作的復雜程度較高,程序主要使用回調方式進行處理,與普通人的思維方式有些 初入,而且難以調試。
非同步和多線程的區別之多線程的優缺點
多線程的優點很明顯,線程中的處理程序依然是順序執行,符合普通人的思維習慣,所以編程簡單。但是多線程的缺點也同樣明顯,線程的使用(濫用)會給系統帶來上下文切換的額外負擔。並且線程間的共享變數可能造成死鎖的出現。
適用范圍
在了解了線程與非同步操作各自的優缺點之後,我們可以來探討一下線程和非同步的合理用途。我認為:當需要執行I/O操作時,使用非同步操作比使用線程+同步 I/O操作更合適。I/O操作不僅包括了直接的文件、網路的讀寫,還包括資料庫操作、Web Service、HttpRequest以及.net Remoting等跨進程的調用。
而線程的適用范圍則是那種需要長時間CPU運算的場合,例如耗時較長的圖形處理和演算法執行。但是往 往由於使用線程編程的簡單和符合習慣,所以很多朋友往往會使用線程來執行耗時較長的I/O操作。這樣在只有少數幾個並發操作的時候還無傷大雅,如果需要處 理大量的並發操作時就不合適了。
㈡ 如何通過線程池來實現非同步調用
步
㈢ Servlet3中的AsyncContext非同步和多線程非同步有什麼區別
非同步和多線程可以說沒有必然的聯系,只能說非同步可以通過多線程實現而已
要理解這些東西,你得具備很多相關的知識,操作系統原理,編譯原理等
簡單地來說,計算機或者說CPU執行你的代碼都是順序執行的,當前的語句沒有執行完,不會執行後面的語句的,這是永遠不變的規則!
但是這樣的機制會使整個執行效率很低,因為CPU總是要等待當前的語句執行完畢了才會執行後面的代碼,而計算機在絕多數的時候都是處於等待用戶的輸入,等待磁碟文件的讀取完成,等待網路數據的傳輸完成中,所以為了提高整個系統的運行效率,提高CPU的執行效率,計算機系統引入了非同步的機制。
非同步機制,簡單地說就是CPU不會傻傻地處於等待狀態,它會先干別的事情,當它需要的東西已經准備完畢後(大多數的情況都是等待外部的輸入數據准備完畢,也有些是復雜的計算完畢),硬體系統給CPU一個中斷,告訴有了新的數據了,你現在可以去處理了。
這就是最基本的非同步原理,而現代操作操作系統對硬體系統做了良好的封裝,把很多底層機制屏蔽了,為程序的開發者提供了事件和多線程的概念,讓程序的開發者可以更好地利用非同步機制。
再說說多線程吧。多線程是計算機引入了操作系統之後才有的概念,至於為什麼計算機要引入操作系統,在此就不敘述了,自行了解。多線程的實現有兩個方法,一個就是增加CPU的核數和個數,這是最直接的方法,還有一種是採用CPU輪詢的方式,每個進程都執行一段時間,又去執行另一個進程的指令,由於切換的速度非常的快,給人的感覺就是同時執行的。
說了這么多,你可能很失望,因為沒有代碼,沒有舉例。但我想說的是,用代碼無法說明這個問題,不同的操作系統,不同的編程語言,不同的編程框架,對非同步和多線程的定義和處理是不一樣的,但原理就是這樣的。
我們寫代碼無非就是寫一堆的指令去要求CPU執行,同步的方式就是這樣的:
我:hi,CPU,我要你做一件事情,而且必須立刻馬上就做,因為我正在等著你。
CPU:那你就等著吧,我現在去做。
非同步的方式是這樣的:
我:hi,CPU,我要你做一件事情,但是不是立刻就做,你可以交給下面的人去做,或者找一個幫手來,我們繼續做後面的事情.
CPU:好的,我現在通知硬體去做,等有結果了我通過事件告訴你
或者
CPU:好的,我讓另一個核心來做這件事情,我們繼續(其實多線程是操作系統實現的,我只是這么舉個例子而已)
㈣ springboot中如何使用線程池及非同步線程
有一些業務需求,需要是非同步進行的,不能影響當前線程的運行,在spring boot中則能通過註解和配置快速實現這個。
首先寫個非同步線程池配置類,如下:
@Configuration@EnableAsyncpublic class AsyncConfig {
@Value("${async.executor.thread.core_pool_size}") private int corePoolSize; @Value("${async.executor.thread.max_pool_size}") private int maxPoolSize; @Value("${async.executor.thread.queue_capacity}") private int queueCapacity; private String threadNamePrefix = "AsyncExecutorThread-"; @Bean(name = "asyncExecutor") public Executor asyncExecutor() {
ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
executor.setCorePoolSize(corePoolSize);
executor.setMaxPoolSize(maxPoolSize);
executor.setQueueCapacity(queueCapacity);
executor.setThreadNamePrefix(threadNamePrefix);
executor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy());
executor.initialize(); return executor;
}
}
然後將需要非同步執行的業務步驟寫成方法用@sync註解即可,如下:
@Componentpublic class AsyncExecutorCommon {
@Async("asyncExecutor") public void loadPic(IfcTingshenJzml tsJzml,
WsTingshenJzmlService wsTingshenJzmlService) {
List<IfcTingshenJzml> tsJzmls = new ArrayList<IfcTingshenJzml>();
tsJzmls.add(tsJzml);
wsTingshenJzmlService.docService(tsJzmls);
}
}12345678910
在業務代碼里直接調用這個方法即可,這個方法的執行就是非同步的。注意,非同步方法和調用非同步的方法不能寫在一個類里,否則會報循環依賴異常,建議另建一個類,只用來放非同步方法。
㈤ 如何在指定的線程池對象中執行非同步任務
那你其他的線程不要獨佔CPU,在必要的地方添加語句sleep(10)休眠下,就可以釋放CPU給其他線程了,你所創建的線程就可以及時執行了。
㈥ 多線程實現的幾種常用的方法
有三種:
(1)繼承Thread類,重寫run函數
創建:
class xx extends Thread{
public void run(){
Thread.sleep(1000) //線程休眠1000毫秒,sleep使線程進入Block狀態,並釋放資源
}}
開啟線程:
對象.start() //啟動線程,run函數運行
(2)實現Runnable介面,重寫run函數
開啟線程:
Thread t = new Thread(對象) //創建線程對象
t.start()
(3)實現Callable介面,重寫call函數
Callable是類似於Runnable的介面,實現Callable介面的類和實現Runnable的類都是可被其它線程執行的任務。
Callable和Runnable有幾點不同:
①Callable規定的方法是call(),而Runnable規定的方法是run().
②Callable的任務執行後可返回值,而Runnable的任務是不能返回值的
③call()方法可拋出異常,而run()方法是不能拋出異常的。
④運行Callable任務可拿到一個Future對象,Future表示非同步計算的結果。它提供了檢查計算是否完成的方法,以等
待計算的完成,並檢索計算的結果.通過Future對象可了解任務執行情況,可取消任務的執行,還可獲取任務執行的結果
㈦ java並發框架有哪些
Java並發框架java.util.concurrent是JDK5中引入到標准庫中的(採用的是Doug
Lea的並發庫)。該包下的類可以分為這么塊:
Executors
1)介面:
Executor(例子涉及):用來執行提交的Runnable任務的對象。是一個簡單的標准化介面,用來定義包括線程池、非同步IO、輕量級任務框架等等。任務可以由一個新創建的線程、一個已有任務執行線程、或是線程直接調用execute()來執行,可以串列也可並行執行,取決於使用的是哪個Executor具體類。
ExecutorService(例子涉及):Executor的子介面,提供了一個更加具體的非同步任務執行框架:提供了管理結束的方法,以及能夠產生Future以跟蹤非同步任務進程的方法。一個ExcutorService管理著任務隊列和任務調度。
ScheledExecutorService(例子涉及):ExecutorService的子介面,增加了對延遲和定期任務執行的支持。
Callable(例子涉及):一個返回結果或拋出異常的任務,實現類需要實現其中一個沒有參數的叫做call的方法。Callabe類似於Runnable,但是Runnable不返回結果且不能拋出checked
exception。ExecutorService提供了安排Callable非同步執行的方法。
Future(例子涉及):代表一個非同步計算的結果(由於是並發執行,結果可以在一段時間後才計算完成,其名字可能也就是代表這個意思吧),提供了可判斷執行是否完成以及取消執行的方法。
2)實現:
ThreadPoolExecutor和ScheledThreadPoolExecutor:可配置線程池(後者具備延遲或定期調度功能)。
Executors(例子涉及):提供Executor、ExecutorService、ScheledExecutorService、ThreadFactory以及Callable的工廠方法及工具方法。
FutureTask:對Future的實現
ExecutorCompletionService(例子涉及):幫助協調若干(成組)非同步任務的處理。
Queues
非阻塞隊列:ConcurrentLinkedQueue類提供了一個高效可伸縮線程安全非阻塞FIFO隊列。
阻塞隊列:BlockingQueue介面,有五個實現類:LinkedBlockingQueue(例子涉及)、ArrayBlockingQueue、SynchronousQueue、PriorityBlockingQueue和DelayQueue。他們對應了不同的應用環境:生產者/消費者、消息發送、並發任務、以及相關並發設計。
Timing
TimeUnit類(例子涉及):提供了多種時間粒度(包括納秒)用以表述和控制基於超時的操作。
Synchronizers 提供特定用途同步語境
Semaphore(例子涉及):計數信號量,這是一種經典的並發工具。
CountDownLatch(例子涉及):簡單的倒計數同步工具,可以讓一個或多個線程等待直到另外一些線程中的一組操作處理完成。
CyclicBarrier(例子涉及):可重置的多路同步工具,可重復使用(CountDownLatch是不能重復使用的)。
Exchanger:允許兩個線程在匯合點交換對象,在一些pipeline設計中非常有用。
Concurrent Collections
除隊列外,該包還提供了一些為多線程上下文設計的集合實現:ConcurrentHashMap、CopyOnWriteArrayList及CopyOnWriteArraySet。
注意:"Concurrent"前綴的類有別於"synchronized"前綴的類。「concurrent」集合是線程安全的,不需要由單排斥鎖控制的(無鎖的)。以ConcurrentHashMap為例,允許任何數量的並發讀及可調數量的並發寫。「Synchronized」類則一般通過一個單鎖來防止對集合的所有訪問,開銷大且伸縮性差。
㈧ C# 線程池的線程能實現非同步回調嗎
可以的!!
你需要把你要
回調
的函數委託在創建線程的時候傳遞進去就可以了!!
使用beginInvoke
方法實現非同步回調!!