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方法,可以在線程啓動的時候,做這個事情。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章