1. 程式人生 > >執行緒基礎知識入門

執行緒基礎知識入門

xl_echo編輯整理,歡迎轉載,轉載請宣告文章來源。更多IT、程式設計案例、資料請聯絡QQ:1280023003
百戰不敗,依不自稱常勝,百敗不頹,依能奮力前行。——這才是真正的堪稱強大!!


前言:什麼是執行緒?執行緒,有時被稱為輕量程序(Lightweight Process,LWP),是程式執行流的最小單元。一個標準的執行緒由執行緒ID,當前指令指標(PC),暫存器集合和堆疊組成。另外,執行緒是程序中的一個實體,是被系統獨立排程和分派的基本單位,執行緒自己不擁有系統資源,只擁有一點兒在執行中必不可少的資源,但它可與同屬一個程序的其它執行緒共享程序所擁有的全部資源。一個執行緒可以建立和撤消另一個執行緒,同一程序中的多個執行緒之間可以併發執行。由於執行緒之間的相互制約,致使執行緒在執行中呈現出間斷性。執行緒也有就緒、阻塞和執行三種基本狀態。就緒狀態是指執行緒具備執行的所有條件,邏輯上可以執行,在等待處理機;執行狀態是指執行緒佔有處理機正在執行;阻塞狀態是指執行緒在等待一個事件(如某個訊號量),邏輯上不可執行。每一個程式都至少有一個執行緒,若程式只有一個執行緒,那就是程式本身。

  • 瞭解單執行緒的main方法,使用while死迴圈瞭解單執行緒的缺點及優點

示例:

package com.waylau.spring.boot.thymeleaf.thread;

import java.util.concurrent.TimeUnit;

public class TryConcurrency{

  public static void main(String[] args){

    browseNews();
    enjoyMusic();

  }

  private static void browseNews(){
    while
(true){ System.out.println("在樹下看報紙"); sleep(1); } } private static void enjoyMusic(){ while (true){ System.out.println("在書房聽音樂"); sleep(1); } } private static void sleep(int seconds){ try{ TimeUnit.SECONDS.sleep(seconds); }catch (InterruptedException e){ e.printStackTrace(); } } }

如果不瞭解執行緒的朋友可以試著執行這段程式碼,在這段程式碼中我使用了while(true){}這樣的死迴圈,其主要目的就是為了保證當前執行緒一致在我的while迴圈中,只要迴圈崩潰執行緒就會一致被我的while死迴圈暫用。(main方法是單執行緒)。所以我們不難看出,當程式只有一個執行緒的時候,我們使用while死迴圈那麼就無法繼續往下執行,因為main方法的唯一執行緒被當前while迴圈佔用了。

以上程式輸出結果如下:
這裡寫圖片描述

那麼,怎麼樣才能保證我們的兩個while迴圈都能夠同時輸出呢?那麼我們這裡就要使用多執行緒了。既然剛剛說到了while死迴圈佔用了一個執行緒,執行緒無法往下執行,第二個死迴圈需要執行就需要得到第二條執行緒,那麼我們可以重新開一條執行緒

示例2

package com.waylau.spring.boot.thymeleaf.thread;

import java.util.concurrent.TimeUnit;

public class TryConcurrency{

  public static void main(String[] args){
    new Thread(){//重新建立一條執行緒
      @Override
      public void run(){
        enjoyMusic();
      }
    }.start();
    browseNews();
  }

  private static void browseNews(){
    while (true){
      System.out.println("在樹下看報紙");
      sleep(1);
    }
  }

  private static void enjoyMusic(){
    while (true){
      System.out.println("在書房聽音樂");
      sleep(1);
    }
  }

  private static void sleep(int seconds){
    try{
      TimeUnit.SECONDS.sleep(seconds);
    }catch (InterruptedException e){
      e.printStackTrace();
    }
  }

}

當我們再一次執行以上代買之後會發現,我們的第二個while死迴圈開始執行了, 並且和第一個while死迴圈一統執行。執行結果如下:
這裡寫圖片描述

我們上面已經看到了在main方法裡面同時執行兩個while死迴圈,必定有一個不能執行,原因就是因為只有一條執行緒,死迴圈佔用執行緒之後是不會釋放的,導致後面一個死迴圈無法執行。那麼我們使用new Thread 執行緒之後兩個執行緒就滿足了我們想同時執行兩個while死迴圈的需求。

從以上我們就可以直觀的看到單執行緒和雙執行緒的一個效果。那麼我們程式是不是就不需要單執行緒了呢?多執行緒可以執行多個任務,單執行緒的使用貌似盡顯劣勢。

  • 單執行緒優勢:執行緒比較安全,容易管理和維護,消耗資源比較小。實際應用中,我們應用的比較多如Redis等就是使用的單項成,能夠很好的保證資料的安全。
  • 多執行緒不同:它的優勢在於能夠加快程式的執行,但是資源消耗會高,維護也會相對困難。但是他最大的好處是能夠接受很多個任務同時執行,就比如我們剛剛的需求,希望兩個while死迴圈都執行。最為直觀的就是我們電腦,多個軟體,每一個軟體可能是一個執行緒或者兩個以上的執行緒在執行,如果需要同時啟動多個軟體,就需要很多執行緒來維護軟體的執行。

執行緒對於我們來說他的生命週期是怎麼樣子的呢?這一點我們下一章詳細講解。。。