串行,并行,并发
我們先來(lái)了解一下幾個(gè)概念
串行
在串行的概念中會(huì)有兩個(gè)概念
1.串行(serial)與并行(parallel)相對(duì)應(yīng),是指的我們從事某項(xiàng)工作時(shí)一個(gè)步驟一個(gè)步驟的去實(shí)施。
2.指串行通信。串行通信是指 使用一條數(shù)據(jù)線,將數(shù)據(jù)一位一位地依次傳輸,每一位數(shù)據(jù)占據(jù)一個(gè)固定的時(shí)間長(zhǎng)度。
?當(dāng)中通信中串行和并行的話,又存在多路復(fù)用情況多路復(fù)用是指以同一傳輸媒質(zhì)(線路)承載多路信號(hào)進(jìn)行通信的方式。各路信號(hào)在送往傳輸媒質(zhì)以前,需按一定的規(guī)則進(jìn)行調(diào)制,以利于各路已調(diào)信號(hào)在媒質(zhì)中傳輸,并不致混淆,從而在傳到對(duì)方時(shí)使信號(hào)具有足夠能量,且可用反調(diào)制的方法加以區(qū)分、恢復(fù)成原信號(hào)。多路復(fù)用常用的方法有頻分多路復(fù)用和時(shí)分多路復(fù)用,碼分多路復(fù)用的應(yīng)用也在不斷擴(kuò)大。
?下圖表示,線程串行情況,有n個(gè)任務(wù)或者你可以理解n個(gè)函數(shù),由一個(gè)線程順序執(zhí)行,
?
優(yōu)點(diǎn):由于任務(wù),函數(shù)都在一個(gè)線程執(zhí)行所以不存在線程不安全情況,也就不存在臨界區(qū)的問(wèn)題。缺點(diǎn):不能很好的利用cpu(當(dāng)代多核心,多cpu硬件情況)的資源提高處理優(yōu)勢(shì)。
?來(lái)看看一個(gè)斷代碼展示
1 public static void main(String[] args) throws InterruptedException {2 //線程串行情況,順序執(zhí)行3 run1();4 run2();5 run3();6 }7 8 //任務(wù)19 public static void run1() { 10 System.out.println("run1()->" + System.currentTimeMillis()); 11 } 12 13 //任務(wù)2 14 public static void run2() { 15 System.out.println("run2()->" + System.currentTimeMillis()); 16 } 17 18 //任務(wù)3 19 public static void run3() { 20 System.out.println("run3()->" + System.currentTimeMillis()); 21 }由于只有主線程,沒(méi)有其他線程情況下,這些任務(wù)/函數(shù)都是單線程執(zhí)行的
并行
當(dāng)系統(tǒng)有一個(gè)以上CPU時(shí),則線程的操作有可能非并發(fā)。當(dāng)一個(gè)CPU執(zhí)行一個(gè)線程時(shí),另一個(gè)CPU可以執(zhí)行另一個(gè)線程,兩個(gè)線程互不搶占CPU資源,可以同時(shí)進(jìn)行,這種方式我們稱之為并行(Parallel)。
下圖表示的并行情況,又N個(gè)線程,去分別執(zhí)行N個(gè)任務(wù)。
?
優(yōu)點(diǎn):由于任務(wù),函數(shù)是在 N 個(gè)線程執(zhí)行所以速度快,執(zhí)行效率高CPU(當(dāng)代多核心,多cpu硬件情況)的利用與也高。缺點(diǎn):存在線程不安全情況,也就是存在臨界區(qū)的問(wèn)題會(huì)出現(xiàn)數(shù)據(jù)不準(zhǔn)確,不安全,臟數(shù)據(jù)。
?代碼展示
1 public static void main(String[] args) throws InterruptedException {2 //線程并行情況,有多個(gè)線程執(zhí)行多個(gè)任務(wù)/函數(shù)3 new Thread(new Run1()).start();4 new Thread(new Run2()).start();5 }6 7 //任務(wù)18 static class Run1 implements Runnable {9 10 @Override 11 public void run() { 12 //執(zhí)行任務(wù)1 13 run1(); 14 //執(zhí)行任務(wù)3 15 run3(); 16 } 17 } 18 //任務(wù)2 19 20 static class Run2 implements Runnable { 21 22 @Override 23 public void run() { 24 //執(zhí)行任務(wù)3 25 run3(); 26 //執(zhí)行任務(wù)1 27 run1(); 28 //執(zhí)行任務(wù)2 29 run2(); 30 } 31 } 32 33 //任務(wù)1 34 public static void run1() { 35 System.out.println("run1()->" + System.currentTimeMillis()); 36 } 37 38 //任務(wù)2 39 public static void run2() { 40 System.out.println("run2()->" + System.currentTimeMillis()); 41 } 42 43 //任務(wù)3 44 public static void run3() { 45 System.out.println("run3()->" + System.currentTimeMillis()); 46 }并發(fā)
并發(fā)當(dāng)有多個(gè)線程在操作時(shí),如果系統(tǒng)只有一個(gè)CPU,則它根本不可能真正同時(shí)進(jìn)行一個(gè)以上的線程,它只能把CPU運(yùn)行時(shí)間劃分成若干個(gè)時(shí)間段,再將時(shí)間 段分配給各個(gè)線程執(zhí)行,在一個(gè)時(shí)間段的線程代碼運(yùn)行時(shí),其它線程處于掛起狀。.這種方式我們稱之為并發(fā)(Concurrent)。
并發(fā)和并行是即相似又有區(qū)別的兩個(gè)概念,并行是指兩個(gè)或者多個(gè)事件在同一時(shí)刻發(fā)生;而并發(fā)是指兩個(gè)或多個(gè)事件在同一時(shí)間間隔內(nèi)發(fā)生。在多道程序環(huán)境下,并發(fā)性是指在一段時(shí)間內(nèi)宏觀上有多個(gè)程序在同時(shí)運(yùn)行,但在單處理機(jī)系統(tǒng)中,每一時(shí)刻卻僅能有一道程序執(zhí)行,故微觀上這些程序只能是分時(shí)地交替執(zhí)行。倘若在計(jì)算機(jī)系統(tǒng)中有多個(gè)處理機(jī),則這些可以并發(fā)執(zhí)行的程序便可被分配到多個(gè)處理機(jī)上,實(shí)現(xiàn)并行執(zhí)行,即利用每個(gè)處理機(jī)來(lái)處理一個(gè)可并發(fā)執(zhí)行的程序,這樣,多個(gè)程序便可以同時(shí)執(zhí)行。總結(jié)
- 上一篇: C# Socket系列二 简单的创建 s
- 下一篇: git 拉取和获取 pull 和 fet