2.多執行緒-區分執行緒與程序
阿新 • • 發佈:2018-11-24
執行緒與程序
程序是計算機中的程式關於某資料集合上的一次執行活動,是系統進行資源分配和排程的基本單位,是作業系統結構的基礎,在早期面向程序設計的計算機結構中,程序是程式的基本執行實體,在當代面向執行緒的計算機結構中,程序是執行緒的容器,程式是指令資料及其組織形式的描述,程序是程式的實體。
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 */View Code13 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: -- : 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方法,可以線上程啟動的時候,做這個事情。