我認為大家將非同步的概念 和多執行緒混淆在一起了
舉個簡單的例子, 假設我要做 燒開水,舉槓鈴100下, 洗衣服 3件事情。
燒開水 這件事情, 我要做的事情為, 準備燒開水 1分鐘, 等開水燒開 8 分鐘 , 關掉燒水機 1分鐘
舉槓鈴100下 我要做的事情為, 舉槓鈴100下 10分鐘
洗衣服 我要做的事情為, 準備洗衣服 1分鐘, 等開水燒開 5 分鐘 , 關掉洗衣機 1分鐘
單核情況下
同步的完成,我需要做的時間為 1+ 8 +1 + 10 + 1+ 5 +1 = 27 分
如果非同步,就是在等的時候,我可以切換去做別的事情
準備燒開水(1) + 準備洗衣服(1) + 舉50下槓鈴 (5)分鐘+ 關洗衣機 1分鐘 + 舉槓鈴20下 (2)分鐘+ 關燒水機 1分鐘 + 舉30下槓鈴(3)分鐘
1+1+5+1+2+1+3 =14 分鐘
多核雙核 非同步 並行
核1 準備燒開水 1分鐘+ 舉槓鈴50下(5)分鐘+ 等待3分鐘 + 關掉燒水機 1分鐘
核2 準備洗衣服 1分鐘+ 舉槓鈴50下(5)分鐘+ 關掉洗衣機 1分鐘 + 等待3分鐘
其實只花了 1+5+3+1 = 10分鐘
其中還有雙核都等待了3分鐘
雙核 非同步 非並行
核1 舉槓鈴100下(10)分鐘
核2 準備燒開水 1分鐘+ 準備洗衣服 1分鐘+ 等待5 分鐘+ + 關掉燒水機 1分鐘 + 等待 1 分鐘 + 關掉洗衣機 1分鐘
其實只花了 1+5+3+1 = 10分鐘
多執行緒的做法
單核下執行緒1 準備燒開水 1分鐘, 等開水燒開 8 分鐘 , 關掉燒水機 1分鐘
執行緒2 舉槓鈴100下 10分鐘
執行緒3 準備洗衣服 1分鐘, 等開水燒開 5 分鐘 , 關掉洗衣機 1分鐘
cpu 可能這麼切換 最理想的切換方式
執行緒1 準備燒開水1 sleep 1 sleep 5 sleep 1 sleep 2 關開水 1分鐘 exit
執行緒2 sleep 1 sleep 1 舉槓鈴50 5分鐘 sleep 1 舉槓鈴20 2分鐘 sleep1 舉槓鈴30下 3分鐘
執行緒3 sleep 1 準備洗衣服1 分鐘 sleep 5 關洗衣機1分鐘 exit
最後使用了 14分鐘 和非同步是一樣的。
但是實際上是不一樣的,因為執行緒不會按照我們設想的去跑, 如果執行緒2 舉槓鈴先跑,整個流程的速度就下來了。
非同步和同步的區別, 在io等待的時候,同步不會切走,浪費了時間。
如果都是獨佔cpu 的業務, 比如舉槓鈴的業務, 在單核情況下 多線和單線 沒有區別。
多執行緒的好處,比較容易的實現了 非同步切換的思想, 因為非同步的程式很難寫的。多執行緒本身程還是以同步完成,但是應該說
比效率是比不上非同步的。 而且多線很容易寫, 相對效率也高。
多核的好處,就是可以同時做事情, 這個和單核完全不一樣的。
至於多核執行 這3個執行緒的情況 就留給你們自己完成了。
本人水平有限, 有錯誤請指出
舉例:
離你很遠的地方有個很漂亮的女網友,你想知道她到底對你如何,你通過郵政禮儀,寄給她一支玫瑰(相當於非同步呼叫)。因為回執要等很多天,所以,你這些天不必整天傻等回執,可以照樣吃飯工作(處理些簡單的事務),當然,如果你這些天又泡到個mm,這時你就要選擇,如果也用非同步的方法,當然沒問題,因為哪個回執先回來,先處理那個,但如果你對後面這個mm採用同步方式,那你只能解決掉這個同步的mm後,才能處理前面那個回執,不管那個回執何時到達。
這和多執行緒也有點不同,多執行緒是兩個**泡兩個mm,自己泡自己的。
嘿嘿
多執行緒和非同步
非同步執行緒 前台執行緒 後台執行緒 預設前台執行緒 有執行緒的取消 完成 失敗通知等互動性操作 通過jion阻塞,達到執行緒執行的先後次序 預設後台執行緒 無線程的取消 完成 失敗通知等互動性操作 可以減少每次建立執行緒的開銷 static void main string args 主線程執行完...
多執行緒和非同步
c 中非同步和多執行緒的區別是什麼呢?非同步和多執行緒兩者都可以達到避免呼叫執行緒阻塞的目的,從而提高軟體的可響應性。甚至有些時候我們就認為非同步和多執行緒是等同的概念。但是,非同步和多執行緒還是有一些區別的。而這些區別造成了使用非同步和多執行緒的時機的區別。所有的程式最終都會由計算機硬體來執行,所...
非同步和多執行緒的關係
非同步通訊的意思是,當a傳送完訊息之後,不等待b的回應,繼續執行之後的程式.在將來的某個時刻,a再來檢查是否收到b的回應。非同步就是彼此獨立,在等待某事件的過程中繼續做自己的事,不需要等待這一事件完成後再工作。多執行緒是程式設計的邏輯層概念,它是程序中併發執行的一段 多執行緒可以實現執行緒間的切換執...