1. 程式人生 > >JAVA高併發(二)------區分執行緒和程序

JAVA高併發(二)------區分執行緒和程序

執行緒與程序

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

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

執行緒的狀態:

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

 1public enum State {
 2    /**
 3     * 執行緒尚未啟動的執行緒狀態--》Thread t1=new Thread()
 4     */
 5    NEW,
 6
 7    /**
 8     * 可執行執行緒的執行緒狀態。可執行執行緒中的執行緒
 9     *狀態在Java虛擬機器中執行,但它可能
10     *等待來自作業系統的其他資源
11     *處理器等--》t1.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}

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

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

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

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

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

另外一種實現方式

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