標籤:
【進程】
<1>進程是一個靜態概念(代碼載入到記憶體的代碼區,這就表示一個進程).
<2>線程是一個進程裡不同的執行路徑,機器上啟動並執行都是線程。<3>對於單個CPU而言,在同一個時間點上,CPU只支援一個線程運行。真正的多線程是雙CPU或雙核。 【進程與線程】 <1>每個進程都有獨立的代碼和資料空間(進程上下文),進程間的切換會有較大的開銷。<2>線程可以看成是輕量級的進程,同一類線程共用代碼和資料空間,每個線程有獨立的運行棧和程式計數器(PC),線程切換的 的開銷較小。<3>多進程在作業系統中能同時運行多個任務(程式)。<4>多線程在同一應用程式中有多個順序流同時執行。 【說明】 <1>Java的線程是通過java.lang.Thread類實現的。<2>VM啟動時會有一個由主方法(public static void main(){})定義的線程。<3>可以通過建立新的Thread執行個體建立新的線程(在實現對應介面的前提之下)。<4>每個線程都是通過某個特定Thread對象所對應的方法run()來完成其操作的,方法run()稱為線程體。<5>通過調用Thread類的start方法來啟動一個線程。 【線程的建立和啟動】 註:<1>在main方法繼續執行的情況下,運行線程(這兩個是交替運行或者說是並列運行)。 <2>這兩種方法推薦使用介面實現的方法,因為使用繼承之後不能再實現別的類(Java不支援多繼承),而實現一個介面之 後還能繼承類或實現別的介面,這樣便於實際中的應用(只要能使用介面就不要使用類繼承)。 【線程狀態轉換】 註:<1>調用start()方法時不一定就執行該線程,而是處於就緒狀態。 <2>調入到CPU後才處於運行狀態。 【線程常用方法】 註:<1>new出來之後還未start,這時是“死的”;就緒狀態、運行狀態、阻塞狀態都是“活的”。 【sleep/join/yield方法】 ----sleep方法 <1>可以調用Thread的
靜態方法: public static void sleep(long mills)throws InterruptedException //使得當前線程休眠(暫時停止mills毫秒) //一定會拋出異常(處於睡眠狀態被喚醒時就是一個異常) 【程式】 public static void main(String[] args){ MyThread thread = new MyThread(); thread.start(); try { Thread.sleep(1000); } catch(InterruptedException e){} thread.interrupt(); //關閉線程(這種關閉方式不推薦,更不推薦使用stop,Windows進程殺死就是使用的該方法) } class MyThread extends Thread{ public void run(){ while(true){ System.out.println(new Date()); try{ sleep(1000); }catch(InterruptedException e){ return; } } } 注意:這裡不能在run方法上拋出異常,因為run是重寫的方法,重寫的方法不能拋出與被重寫方法不一樣的異常,這裡只能 用try-catch語句。 <2>由於是靜態方法,sleep可以由類名直接調用: Thread.sleep(); ----join方法 合并多個線程(相當於方法調用,不再是原來多線程中的同步運行) ----yield方法 讓出CPU,給其他線程執行的機會。 【線程的優先順序】 <1>Java提供一個線程調度器來監控程式中啟動後進入就緒狀態的所有線程。 線程調度器按照線程的優先順序決定應調度哪個線程來執行。 <2>線程的優先順序用數字表示,範圍從1到10,一個線程的預設優先順序是5. Thread.MIN_PRIORITY = 1; Thread.MAX_PRIORITY = 10; Thread.NORM_PRIORITY = 5; <3>使用下面的方法獲得或設定線程對象的優先順序: int getPriority(); void setPriority(int newPriority); 【線程同步】
Java——線程