1. 程式人生 > 實用技巧 >java多執行緒程式設計基礎一 基本概念

java多執行緒程式設計基礎一 基本概念

概念一:什麼是任務?

  在生活中,我們經常聽到有人說:“小李,安排你一個任務,你過會把這個資料送到601辦公室”。生活中的這個任務其實就是小李要乾的一件事情,那麼在併發程式設計中的任務的概念就和生活中一樣。併發程式設計中的任務也是一件事情,這件事的呈現形式就是我們寫的程式碼,這個程式碼的功能就是我們要乾的一件事情。例如下面的一段程式碼:

public class Task implements Runnable {

    @Override
    public void run() {
        System.out.println(1+2);
        
    }

}

上述這段程式碼要乾的一件事情就是輸出1+2的結果,這段程式碼就是描述了一件事情(一個任務)。

總之併發程式設計中任務的概念就是我們為了某個特定功能編寫的程式碼。

“小李,安排你一個任務,你過會把這個資料送到601辦公室”,在這個描述中,把資料送到601辦公室是任務,那麼去執行任務的是小李這個人。同樣的,程式碼只是描述了一個任務,那麼要完成這個任務也需要一個實體去執行。在併發程式設計中執行任務的實體就是執行緒或者程序。

概念二:什麼是程序、什麼是執行緒?

狹義定義:程序就是一段程式的執行過程。
廣義定義:程序是一個具有一定獨立功能的程式關於某個資料集合的一次執行活動。它是作業系統動態執行的基本單元,在傳統的作業系統中,程序既是基本的分配單元,也是基本的執行單元。

執行緒是程序的一個實體,是CPU排程和分派的基本單位,它是比程序更小的能獨立執行的基本單位.執行緒自己基本上不擁有系統資源,只擁有一點在執行中必不可少的資源(如程式計數器,一組暫存器和棧),但是它可與同屬一個程序的其他的執行緒共享程序所擁有的全部資源.

程序與執行緒在作業系統中或者Linux系統程式設計中做區分意義還算大,如果放在java的併發程式設計中,意義不會很大,我們只要知道他們都是執行任務的實體就行。

概念三:什麼是同步、什麼是非同步?

同步與非同步是用來形容方法呼叫的。例如程式碼:

   public static String A() {
        try {
            Thread.sleep(
10000000); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } return "張三"; } public static void B() { A(); }

在B方法中,呼叫了A方法。A方法要執行好久,而B方法要等著A方法執行完才會繼續向下執行,那麼這時候B呼叫A方法就屬於同步呼叫。如果B方法不等A執行完就直接往下執行,那麼這時候B對A的呼叫就是非同步呼叫。

概念四:掛起、休眠、阻塞與非阻塞

掛起(Suspend):當執行緒被掛起的時候,其會失去CPU的使用時間,直到被其他執行緒(使用者執行緒或排程執行緒)喚醒。

休眠(Sleep):同樣是會失去CPU的使用時間,但是在過了指定的休眠時間之後,它會自動啟用,無需喚醒(整個喚醒表面看是自動的,但實際上也得有守護執行緒去喚醒,只是不需程式設計者手動干預)。

阻塞(Block):線上程執行時,所需要的互斥資源不能得到,則執行緒被掛起,直到滿足可操作的條件。

非阻塞(Block):線上程執行時,所需要的互斥資源不能得到,則執行緒不是被掛起等待,而是繼續執行其餘事情,待條件滿足了之後,收到了通知(同樣是守護執行緒去做)再執行。

而阻塞與非阻塞則是在互斥資源不能得到時的兩種處理方式,不限於作業系統,當互斥資源申請不到時,要麼掛起執行緒等待、要麼繼續執行其他操作,互斥資源被滿足後再通知該執行緒重新請求。顯然非阻塞的效率要高於阻塞,相應的實現的複雜度也要高一些。

概念五:臨界區

臨界區是用來代表一種公共的資源或者說共享資料。具體到java多執行緒中就是一段互斥程式碼。