線程與進程
進程是計算機中的程序關於某數據集合上的一次運行活動,是系統進行資源分配和調度的基本單位,是操作系統結構的基礎,在早期面向進程設計的計算機結構中,進程是程序的基本執行實體,在當代面向線程的計算機結構中,進程是線程的容器,程序是指令數據及其組織形式的描述,進程是程序的實體。
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方法,可以在線程啓動的時候,做這個事情。