(程序、執行緒),(並行、併發),(同步、非同步)的理解
阿新 • • 發佈:2020-12-12
技術標籤:JUC
1、程序和執行緒
1.1、程序和執行緒
[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片儲存下來直接上傳(img-hIIdLGyB-1607654523249)(C:/Users/lenovo/AppData/Roaming/Typora/typora-user-images/image-20201127095900340.png)]
1.2、並行和併發
單核cpu下,執行緒實際上還是序列執行的,作業系統中有一個元件,叫做任務排程器,將cpu的時間片交給不同的執行緒使用,只是由於cpu線上程間(時間片很短)的切換非常快,人類感覺是同時執行的。總結一句話就是:微觀序列,巨集觀並行
一般會將這種執行緒輪流使用cpu的做法稱為併發。
而並行是在多核cpu的情況下,可以真正的同時執行多個執行緒。
總結來說:
- 併發(concurrent)是同一時間應對(dealing with)多件事情的能力。
- 並行(parallel)是同一時間動手做(doing)多件事情的能力。
1.3、同步和非同步
- 同步等待
/**
* 同步等待
*/
public class Sync {
public static void main(String[] args) throws InterruptedException {
System.out.println("hello");
System. out.println("world");
}
}
do other things必須等待前面操作完成
-
非同步不等待
/** * 非同步不等待 */ public class Async { public static void main(String[] args) { new Thread(() -> { System.out.println("hello"); },"Thread1").start(); System.out.
world不必等待前面完成
多執行緒可以讓方法的執行變成非同步的(即不要乾巴巴的等),比如讀取磁碟檔案,假設讀取操作花費了5秒,如果沒有執行緒排程技術,這5秒呼叫者什麼也做不了,其他程式碼都得暫停。
結論:
- 需要等待結果返回,才能繼續執行就是同步
- 不需要等到結果返回,就能繼續執行就是非同步
1.4、總結
1、單核cpu下,多執行緒不能實際提高程式執行效率,只是為了能夠在不同的任務之間切換,不同執行緒輪流使用cpu,不至於一個執行緒總佔用cpu,別的執行緒沒法幹活。
2、多核cpu可以並行跑多個執行緒,但能否提高執行效率還是要分情況的
- 有些任務,經過精心設計,將任務拆分,並行執行,當然可以提高程式的執行效率,但不是所有計算
任務都能拆分。
- 也不是所有任務都需要拆分,任務的目的如果不同,談拆分和效率沒有意義。
3、IO操作不佔用cpu,只是我們一般拷貝檔案使用的是【阻塞IO】,這時相當於執行緒雖然不適應cpu,但是
需要一直等待IO結束,沒能充分的利用執行緒,所以才有後面的【非阻塞IO】和【非同步IO】優化。