1. 程式人生 > >2.多執行緒-區分執行緒與程序

2.多執行緒-區分執行緒與程序

執行緒與程序

程序是計算機中的程式關於某資料集合上的一次執行活動,是系統進行資源分配和排程的基本單位,是作業系統結構的基礎,在早期面向程序設計的計算機結構中,程序是程式的基本執行實體,在當代面向執行緒的計算機結構中,程序是執行緒的容器,程式是指令資料及其組織形式的描述,程序是程式的實體。
windows中exe格式檔案,就是一個程式,當執行的時候,exe指令會被載入,就會得到一個關於該exe程式的程序,狀態會變成正在執行中。可以通過工作管理員,來檢視程序的執行狀態

執行緒是輕量級程序,程式執行的最小單位。程序中包括了若干個執行緒,舉個例子:程序就是家,生活用品就是資源,一家的幾個人,就是執行緒,可能中間會發生衝突,但大部分的時候是正常相處,其樂融融的。

執行緒的狀態:

可在Thread.java檔案中的列舉類State 中看到

 1  public enum State {
 2      /**
 3       * 執行緒尚未啟動的執行緒狀態--》Thread t=new Thread()
 4       */
 5      NEW,
 6  
 7      /**
 8       * 可執行執行緒的執行緒狀態。可執行執行緒中的執行緒
 9       *狀態在Java虛擬機器中執行,但它可能
10      *等待來自作業系統的其他資源
11      *處理器等--》t.start()
12      */
13 RUNNABLE, 14 15 /** 16 *執行緒狀態被阻塞,等待監視器鎖。 17 *處於阻塞狀態的執行緒正在等待監視器鎖 18 *輸入同步塊/方法或 19 *呼叫後重新輸入同步塊/方法--》在執行過程中遇到了synchronized同步塊, 20 *就會進入這個狀態 21 *直至獲取到請求的鎖 22 */ 23 BLOCKED, 24 25 /** 26 *等待執行緒的執行緒狀態--》與TIMED_WAITING都表示等待的狀態, 27 *區別是WAITING會進入一個無時間限制的等待,
28 *比如wait()在等待notify()方法,否則會一直等待 29 */ 30 WAITING, 31 32 /** 33 *具有指定等待時間的等待執行緒的執行緒狀態。 34 *由於呼叫一個執行緒,執行緒處於定時等待狀態。 35 *具有指定的正等待時間的以下方法--》執行緒在等待喚醒,但設定了時限 36 */ 37 TIMED_WAITING, 38 39 /** 40 *終止執行緒的執行緒狀態。 41 *執行緒已完成執行--》執行緒結束的狀態 42 */ 43 TERMINATED; 44 }
View Code
 

執行緒中start()方法與run()方法的區別:

 1  /**
 2   * @program: designPattern
 3   * @description: 測試
 4   * @author: Mr.Yang
 5   * @create: -- :
 6   **/
 7  public class Test {
 8      public static void main(String[] args) {
 9          Thread thread = new Thread();
10         thread.start();
11         thread.run();
12     }
13 }
View Code

 

 

可以看到start()呼叫的是native-->本地方法

run()呼叫的是實現Runnable介面的run方法,start()與run()做的事情是不一樣的。
所以如果直接呼叫run()方法,就相等於執行了一個普通方法而已,(本人之前對執行緒不太熟悉,以為兩個是一樣的,直至看了原始碼,算是我碰到的坑吧。)

預設情況情況下,Thread的run()方法什麼都沒有做,如果向啟動執行緒做某事,需要實現run()方法。

另外一種實現方式

Thread的一個有參構造方法,可以傳遞一個Runabble介面,我們通過實現這個介面,重寫Run方法,可以線上程啟動的時候,做這個事情。