1. 程式人生 > 遊戲 >XGP 8月新增遊戲公開 《人類》《極品飛車21》等

XGP 8月新增遊戲公開 《人類》《極品飛車21》等

執行緒簡介

程序與執行緒的區別:

  • 說起程序就不得不說下程式,程式是指令和資料的有序集合,其本身沒有任何執行的含義,是一個靜態的概念。
  • 而程序則是執行程式的一次執行過程,它是一個動態概念,是系統資源分配的單位。
  • 通常在一個程序中可以包含若干個執行緒,當然一個程序中至少包含一個執行緒,不然沒有存在的意義,執行緒是cpu排程和執行的單位。
  • 注意:很多執行緒是模擬出來的,真正的多執行緒是指有多個cpu,即多核,如伺服器。如果是模擬出來的多執行緒,即在一個cpu的情況下,在同一時間點,cpu只能執行一個程式碼,因為切換的很快就有了同時執行的錯覺。

執行緒實現(重點)

Thread

  • 自定義執行緒類繼承Thread類
  • 重寫run()方法,編寫執行緒執行體
  • 建立執行緒物件,呼叫start()方法啟動執行緒
package com.kuang.thread;

//建立執行緒方式1:繼承Thread類,重寫run()方法,呼叫start啟動執行緒
//總結:執行緒開啟不一定執行,由cpu排程
public class TestThread01 extends Thread {
    @Override
    public void run() {
        //run()方法執行緒體
        for (int i = 0; i < 20; i++) {
            System.out.println(
"run方法"+i); } } public static void main(String[] args) { //main執行緒,主執行緒 //建立一個執行緒物件 TestThread01 testThread01 = new TestThread01(); //呼叫start方法開啟執行緒 testThread01.start(); for (int i = 0; i < 20; i++) { System.out.println("main方法"+i); } } }

實現Runnable

  • 定義MyRunnable類實現Runnable介面
  • 實現run()方法,編寫執行緒執行體
  • 建立執行緒物件,呼叫start()方法啟動執行緒
  • package com.kuang.thread;
    
    //建立執行緒方式2:實現Runnable介面,重寫run方法,執行執行緒需要丟入Runnable介面的實現類,呼叫start
    public class TestThread02 implements Runnable{
    
        @Override
        public void run() {
            //run()方法執行緒體
            for (int i = 0; i < 20; i++) {
                System.out.println("run方法"+i);
            }
        }
    
        public static void main(String[] args) {
            //建立Runnable介面實現類的物件
            TestThread02 testThread02 = new TestThread02();
            //建立執行緒物件 通過執行緒物件來開啟執行緒,代理
            Thread thread = new Thread(testThread02);
            thread.start();
            //建立一個執行緒物件
            TestThread01 testThread01 = new TestThread01();
            //呼叫start方法開啟執行緒
            testThread01.start();
            for (int i = 0; i < 20; i++) {
                System.out.println("main方法"+i);
            }
        }
    }

執行緒狀態

執行緒同步(重點)

併發:同一個物件多個執行緒同時操作

  • 現實生活中,我們會遇到“同一個資源,多個人都想使用”的問題,比如,食堂排隊打飯,每個人都想打飯,比較好的解決辦法,就是排隊,按照順序來

  • 處理多執行緒問題時,多個執行緒訪問同一個物件(併發),並且某些執行緒還想修改這個物件,這個時候我們就需要執行緒同步,執行緒同步其實就是一種等待機制,多個需要同時訪問此物件的執行緒進入這個物件的等待池形成佇列,等待前面的執行緒使用完畢,下一個執行緒在使用。

  • 由於同一程序的多個執行緒共享同一塊儲存空間,在帶來方便的同時,也帶來了訪問衝突的問題,為了保證資料在方法中被訪問時的正確性,在訪問時加入鎖機制synchronized,當一個執行緒獲得物件的排它鎖,獨佔資源,其他執行緒必須等待,使用後釋放鎖即可。存在以下問題:

  1. 一個執行緒持有鎖會導致其他需要此鎖的執行緒掛起

  2. 在多執行緒的競爭下,加鎖,釋放鎖會導致較多的上下文切換和排程延時,引起效能問題

  3. 如果一個優先順序高的執行緒等待一個優先順序低的執行緒釋放鎖,會導致優先順序倒置,引起效能問題

執行緒通訊問題

高階主題