1. 程式人生 > 實用技巧 >JAVA學習_多執行緒技術

JAVA學習_多執行緒技術

今天週四!不用加班!又到了小王開心的時候了,這週末雙休 太感動了

週六上午整整宿舍,下午學習,晚上游泳

週日去豬豬那邊自習~~~~週日晚上甜食吃到飽!就這麼愉快的決定了

哎,能在學校學習真的是一個幸福的事情了,肥仔大哭 好吧 開始~

可以看這個:https://www.sxt.cn/Java_jQuery_in_action/History_Direction.html 我就複製下下來會印象深刻

1.基本概念

我們可以上百人、上千人、上萬人同時訪問某個網站,其實,也是基於網站伺服器的多執行緒原理。如果沒有多執行緒,伺服器處理速度會極大降低。

程式:

“程式(Program)”是一個靜態的概念,一般對應於作業系統中的一個可執行檔案,比如:我們要啟動酷狗聽音樂,則對應酷狗的可執行程式。當我們雙擊酷狗,則載入程式到記憶體中,開始執行該程式,於是產生了“程序”。

程序:

執行中的程式叫做程序(Process)

特點:

1. 程序是程式的一次動態執行過程, 佔用特定的地址空間。

2. 每個程序由3部分組成:cpu、data、code。每個程序都是獨立的,保有自己的cpu時間,程式碼和資料,即便用同一份程式產生好幾個程序,它們之間還是擁有自己的這3樣東西,這樣的缺點是:浪費記憶體,cpu的負擔較重。

3. 多工(Multitasking)作業系統將CPU時間動態地劃分給每個程序,作業系統同時執行多個程序,每個程序獨立執行。以程序的觀點來看,它會以為自己獨佔CPU的使用權。

4. 程序的檢視

Windows系統: Ctrl+Alt+Del,啟動工作管理員即可檢視所有程序。

Unix系統: ps or top。

執行緒:

一個程序可以產生多個執行緒。同多個程序可以共享作業系統的某些資源一樣,同一程序的多個執行緒也可以共享此程序的某些資源(比如:程式碼、資料),所以執行緒又被稱為輕量級程序(lightweight process)。

1. 一個程序內部的一個執行單元,它是程式中的一個單一的順序控制流程。

2. 一個程序可擁有多個並行的(concurrent)執行緒

3. 一個程序中的多個執行緒共享相同的記憶體單元/記憶體地址空間,可以訪問相同的變數和物件,而且它們從同一堆中分配物件並進行通訊、資料交換和同步操作。

4. 由於執行緒間的通訊是在同一地址空間上進行的,所以不需要額外的通訊機制,這就使得通訊更簡便而且資訊傳遞的速度也更快。

5. 執行緒的啟動、中斷、消亡,消耗的資源非常少。

執行緒和程序的區別

1. 每個程序都有獨立的程式碼和資料空間(程序上下文),程序間的切換會有較大的開銷。

2. 執行緒可以看成是輕量級的程序,屬於同一程序的執行緒共享程式碼和資料空間,每個執行緒有獨立的執行棧和程式計數器(PC),執行緒切換的開銷小。

3. 執行緒和程序最根本的區別在於:程序是資源分配的單位,執行緒是排程和執行的單位。

4. 多程序: 在作業系統中能同時執行多個任務(程式)。

5. 多執行緒: 在同一應用程式中有多個順序流同時執行

6. 執行緒是程序的一部分,所以執行緒有的時候被稱為輕量級程序。

7. 一個沒有執行緒的程序是可以被看作單執行緒的,如果一個程序內擁有多個執行緒,程序的執行過程不是一條線(執行緒)的,而是多條線(執行緒)共同完成的。

8. 系統在執行的時候會為每個程序分配不同的記憶體區域,但是不會為執行緒分配記憶體(執行緒所使用的資源是它所屬的程序的資源),執行緒組只能共享資源。那就是說,除了CPU之外(執行緒在執行的時候要佔用CPU資源),計算機內部的軟硬體資源的分配與執行緒無關,執行緒只能共享它所屬程序的資源。

2.JAVA中如何實現多執行緒

通過繼承Thread類實現多執行緒

繼承Thread類實現多執行緒的步驟:

1. 在Java中負責實現執行緒功能的類是java.lang.Thread 類。

2. 可以通過建立 Thread的例項來建立新的執行緒。

3. 每個執行緒都是通過某個特定的Thread物件所對應的方法run( )來完成其操作的,方法run( )稱為執行緒體。

4. 通過呼叫Thread類的start()方法來啟動一個執行緒。

public class TestThread extends Thread {//自定義類繼承Thread類
    //run()方法裡是執行緒體
    public void run() {
        for (int i = 0; i < 10; i++) {
            System.out.println(this.getName() + ":" + i);//getName()方法是返回執行緒名稱
        }
    }
 
    public static void main(String[] args) {
        TestThread thread1 = new TestThread();//建立執行緒物件
        thread1.start();//啟動執行緒
        TestThread thread2 = new TestThread();
        thread2.start();
    }
}
//如果把

此種方式的缺點:如果我們的類已經繼承了一個類(如小程式必須繼承自 Applet 類),則無法再繼承 Thread 類。 Java是單繼承的

//這邊如果上面跑100次下面跑10次 我再去試試.........