標籤:自己 extend 處理 選擇 print 主線程 處理機 strong 應用
一.進程與線程進程
我們在進行操作電腦的時候,通常會開啟瀏覽器,通訊工具等應用程式,這個時候CPU通過作業調度在記憶體中就會分配一些空間讓它們處於宏觀上的運行狀態(處於可以被CPU執行的狀態),而這部分空間資源就可以說是相應的進程佔據的,很顯然運行不同的程式需要不同的進程,在記憶體中也為它們分配獨立,無共用的地區。靜態描述進程的是PCB快(資料結構集),它是系統感知進程存在的唯一實體,通常包含進程名(或者標識符),使用者名稱(或者使用者標識號),家族關係。
進程的狀態
就緒態:進程獲得了除cpu以外的其他資源,進入搶佔cpu的隊列中
執行態:cpu正在執行該進程
阻塞態:進程繼續執行的某個事件條件(如I/O裝置)尚未具備
掛起態:處理機調度將進程調離記憶體進入外存
終止態:進程結束。(當我們撤銷一個進程的時候,會通過PCB結構遞迴刪除所有它的子進程,否者子進程可能處於無法控制的狀態。)
(撤銷進程的流程)
進程阻塞與掛起
阻塞詳細流程圖:
阻塞與掛起的區別:
1.首先阻塞是被動行為,當資源完備後,任然受cpu調度進入就緒狀態,而掛起是主動行為,進程外存後,不受cpu作業調度,通過resume()函數進入就緒態。
2.發生原因不同:阻塞原因是針對這單個進程等待發生的條件不具備,而掛起原因記憶體資源有限暫時調離記憶體的過程。
線程
線程也稱為輕型進程。線程的範圍在單個特定的線程內。一個進程內支援多個線程。這些線程的特點是:共用一定的記憶體區和資料。它們是彼此相互獨立的,可以並發進行,宏觀上看來是同時啟動並執行,但實際上CPU在一個時刻只能處理一個子任務,分時作業系統採用了“時間片的策略”,即CPU將時間切割為時間片,然後將這些時間片分配給這些程式,只有獲得時間片的程式才被執行。還有一個概念叫做主線程,它是進程初始化後自動啟動的線程,如java裡面的main。
進程與線程的區別
資源方面:一個進程包含多個線程,同類的多個線程共用一塊記憶體和資料資源,而進程之間(包括子進程與父進程之間)是完全獨立的,不存在資源的共用。
功能方面:進程是並發程式執行過程中資源分派的基本單元,線程是程式運行與調度的基本單元。
處理機的調度
(圖片來自:http://www.cnblogs.com/dyllove98/p/3249243.html)
cpu調度發生的情況總結:
(1)建立進程:當建立新進程時,要決定運行父進程還是子進程;
(2)進程終止:每當一個進程終止時,必須進行調度;從就緒隊列中選擇要執行的下一個進程;
(3)等待事件:運行進程由於等待I/O、訊號量或其他原因而不得不放棄CPU,這樣就必須選擇另一個進程投入運行。
(4)中斷髮生:當I/O裝置完成時後會發出I/O中斷,原先等待I/O的進程就從阻塞態轉換為就緒態。發送器要決定是調用就緒隊列的進程,還是選擇被打斷的進程。
(5)運到到時:當進程進程分配的時間片用完,此時選擇新的進程投入運行。
(很明顯掛起的進程不需要cpu進行作業調度)
二.進程的優先順序
對於所有線程都具有它自己的優先順序,優先順序高的首先被CPU執行,當某個線程處於運行狀態時,那些尚未擁有優先順序的處於可運行狀態的線程會自動獲得優先順序。還存在另一種情況,當某個線程在運行時,一個更高優先順序的線程處於可運行狀態,這是這個線程被立即執行,這稱為先佔式調度。
三.線程的開發方法
1.實現Runnable介面實現它的run()方法
2.繼承Thread類,覆蓋它的run()方法----Thread已經實現了Runnable介面實現了run方法,因此繼承Thread的類是覆蓋run()方法
(Runnable實現線程解決了java單一繼承的局限性)
四.線程池
背景:例如web伺服器,資料庫伺服器,檔案伺服器等伺服器端應用程式,都面臨這來著用戶端的請求,這些請求的整體特點是:單個任務處理的時間很短,但是請求的數目巨大
瓶頸:對於在進程內劃分線程已經是個很大的改進,但仍然存在以下問題,對於每個到達伺服器端的請求,單獨為它們建立一個線程,將請求處理完後,再將線程銷毀,然後線程建立與銷毀的時間比處理請求的時間要多得多。同時線程過多,也會消耗記憶體。
改進:初始的時候便建立一個線程池(擁有i個線程),當請求到達時便擁有線程池中的某個線程(免去了建立時間),當線程池中的所有線程都被佔據的時候,其他請求需要等待,佔據線程的請求處理完後,線程又空餘出來,新的請求可以進入。此處會有一定的等待時間,但和原來繁瑣的線程建立和銷毀相比,效能改進不少,同時線程池的構建也需要不斷最佳化。
五.線程的狀態以及運行控制線程的運行狀態
上述表明了線程在運行過程中的5種狀態:
初始化狀態:通過new執行個體化了一個線程對象,但該對象是空的並沒有分配資源
可運行狀態:通過start()方法,為該線程分配了除了CPU外的所需資源(進入隊列,排隊等待CPU),處於Runnable狀態
運行狀態:線程調度控制CPU處理一個Runnable線程,這個時候才實際上執行run()函數的代碼
阻塞狀態:正在啟動並執行線程由於某些事件尚未具備(例如:輸入輸出)從而進入進入阻塞狀態,來到阻塞池等待
掛起狀態: A,通過調用sleep()方法使線程進入休眠狀態,線程在指定時間內不會運行。
B,通過調用join()方法使線程掛起,如果某個線程在另一個線程t上調用t.join(),這個線程將被掛起,直到線程t執行完畢為止。
C,通過調用wait()方法使線程掛起,直到線程得到了notify()和notifyAll()訊息,線程才會進入“可執行”狀態。
(區別進程的掛起,線程不擁有資源,也不存在將資源放入外存中)
死亡狀態:線程結束了(Dead),可由這些原因導致:1.該線程運行完畢。2.意外退出。3.父類線程式控制制其消亡。
線程的運行控制
1.線程的啟動start()
public class test extends Thread{public void run(){while(true){System.out.println("子線程運行中---"); } }}public static void main(String args[]){test t =new test();t.start();try{Thread.sleep(2000);//父線程進入等待池等待 }catch(Exception e ){}t.stop();}//在上述執行個體中,通過main主線程建立了一個子線程,他們是相互獨立,並發執行,但是父線程可以控制子線程的狀態,例如stop()
2.休眠(sleep)與掛起(yield),join
相同:休眠與掛起都會使線程暫停處於等待狀態
區別:休眠可以設定時間,並且期間任何優先順序的線程都可以由可運行狀態變為可執行狀態,而掛起不可以設定時間,只有同等優先順序的線程可以變成可執行狀態
join立即執行方法
class test1 extends Thread{ static int count = 0; public void run(){ for(int i=0;i<5;i++){ count++; } }}public class join {public static void main(String ats[]){ test1 t = new test1() ; try { t.start(); t.join();//如果沒有這條語句輸出為0,當前輸出為5 } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } System.out.println(test1.count);}}
3.wait()與sleep()區別
public class waitandsleep extends Thread{static int number = 10;public void firstMethod() throws Exception {synchronized (this) {number += 100;System.out.println(number);}}//下面是否加上static,又是一種同步鎖,結果不一樣public synchronized void secondMethod() throws Exception {//用於區別wait和sleep//sleep(在Thread的靜態方法)的時候仍然佔有機鎖,釋放cpu// Thread.sleep(2000);//當把改行注釋轉移到this.wait(2000)時,運行輸出2100//wait(Object的方法)的時候釋放機鎖,其他線程塊可以進入,釋放cputhis.wait(2000);//輸出110number *= 200;} public void run() {try {firstMethod();} catch (Exception e) {e.printStackTrace();}}public static void main(String[] args) throws Exception {waitandsleep ws=new waitandsleep();ws.start();ws.secondMethod();
ps:純手打,圖片是拍的書上的,勉強看的清楚,感覺自己寫博文一直有個弊端,試圖在一篇文章裡面囊括一個大的知識工廠,但現在發現能將一個點講清楚就非常非常困難,所以這篇失敗的博文,還將繼續改善,fighting!!
.進程&線程(&java.lang.Thread)詳解