1. 程式人生 > 其它 >(程序、執行緒),(並行、併發),(同步、非同步)的理解

(程序、執行緒),(並行、併發),(同步、非同步)的理解

技術標籤: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.
    println("world"); } }

在這裡插入圖片描述

world不必等待前面完成

多執行緒可以讓方法的執行變成非同步的(即不要乾巴巴的等),比如讀取磁碟檔案,假設讀取操作花費了5秒,如果沒有執行緒排程技術,這5秒呼叫者什麼也做不了,其他程式碼都得暫停。

結論:

  1. 需要等待結果返回,才能繼續執行就是同步
  2. 不需要等到結果返回,就能繼續執行就是非同步

1.4、總結

1、單核cpu下,多執行緒不能實際提高程式執行效率,只是為了能夠在不同的任務之間切換,不同執行緒輪流使用cpu,不至於一個執行緒總佔用cpu,別的執行緒沒法幹活。

2、多核cpu可以並行跑多個執行緒,但能否提高執行效率還是要分情況的

  • 有些任務,經過精心設計,將任務拆分,並行執行,當然可以提高程式的執行效率,但不是所有計算

任務都能拆分。

  • 也不是所有任務都需要拆分,任務的目的如果不同,談拆分和效率沒有意義。

3、IO操作不佔用cpu,只是我們一般拷貝檔案使用的是【阻塞IO】,這時相當於執行緒雖然不適應cpu,但是

需要一直等待IO結束,沒能充分的利用執行緒,所以才有後面的【非阻塞IO】和【非同步IO】優化。