上個禮拜在工作中(Java Web開發),對一個耗時較久的工具類進行了改造,讓其支援多線程。同時用戶端每隔一段時間發送一次ajax請求,用於擷取工具類的處理進度資訊,下面工作中的一些總結,其中進程和線程部分還有待進一步學習,總結如下:
1.進程
1.1進程的概念
翻閱作業系統原理的定義:進程是一個可並發執行的具有獨立功能的程式關於某個資料集合的一次執行過程,也是作業系統進行資源分派和調度的基本單位。
進程是一個正在執行的程式;電腦中正在啟動並執行程式執行個體;可以分配給處理器並由處理器執行的一個實體;由單一順序的執行顯示,一個目前狀態和一組相關的系統資源所描述的活動單元。比如說Windows中的exe檔案,當運行exe檔案的時候,系統就會分配cpu和記憶體等資源,為該可執行檔exe檔案開闢一個新的進程,也就是說只有當程式執行之後系統才會為其開闢進程,程式沒有執行的時候,只是一個存放在磁碟中的可執行檔。
1.2進程的狀態和轉換
一個進程從建立而產生至撤銷而消亡的整個生命期間,有時佔有處理器執行,
時雖可運行但分不到處理器、有時雖有空閑處理器但因等待某個事件的發生而無法執行,這一切都說明進程和程式不相同,它是活動的且有狀態變化的。
(1)三態模型轉換
一般來說,按進程在執行過程中的不同情況至少要定義三種不同的進程狀態:
運行(running)狀態:進程佔有處理器正在運行。
就緒(ready)狀態:進程具備運行條件,等待系統分配處理器以便運行。
阻塞狀態:又稱為阻塞(blocked)態或睡眠(sleep)態,指進程不具備運行條件,正在等待某個事件的完成。
進程的轉化圖:
進程三態模型及轉換
(2)五態模型轉換圖
建立態:建立一個進程一般分為兩步:首先,為一個新進程建立PCB(進程式控制制塊),並填寫必要的管理資訊;其次,把該進程轉入就緒狀態並插入就緒隊列中
終止態:終止一個進程也分成兩步:首先作業系統對其進行善後處理,然後將PCB清空。
ps:PCB概念。
PCB是為了描述和控制進程的運行,系統為每個進程定義了一個資料結構--進程式控制制塊PCB(processcontrolblock),它是進程實體(程式段、相關的資料區段和PCB)的一部分,是作業系統中最重要的記錄型資料結構。PCB中記錄了作業系統所需的、用於描述進程的當前情況以及控制進程啟動並執行全部資訊。
進程五態模型及轉換
(3)具有掛起功能系統的進程狀態及其轉換
由於進程的不斷建立,系統的資源特別如記憶體資源已經不能滿足進程啟動並執行要求;或者由於系統故障等原因,需要掛起一些進程;或者由於其他的種種原因,必須把某些進程掛起(suspend),對換到磁碟鏡像區中,釋放它所佔有的某些資源,暫時不參與低級調度,起到平滑系統操作負荷的目的。
具有掛起功能系統的進程及轉換
2線程
2.1線程和進程的關係
進程是系統進行資源分派的基本單位,按進程為單位分給存放其映象所需要的虛地址空間、執行所需要的主存空間、完成任務需要的其他各類外圍裝置資源和檔案。同時,進程也是處理器調度的基本單位。
而線程具有許多傳統進程所具有的特徵,所以又成為輕量級整合或者進程元,可以把線程作為調度和分配。在一個進程中,通常擁有一個或者多個線程,這多個線程線程不擁有資源,而是共用進程的資源。用一句話總結就是:在一個進程中,進程是作為資源擁有的基本單位,而線程是作為調度和指派的基本單位,多個線程共用這個進程的資源。
2.2線程的作用
提高系統內程式並發執行的速度,從而進一步提高系統的輸送量。引入線程之後可以減少程式在並發執行時所付出的時空開銷,使系統具有更好的並發性。
3 java中的線程
3.1 java中建立線程的兩種方法
java中建立線程的兩種方法:第一種是實現Runnable介面,第二種是繼承Thread類,下面分別對這兩種方式進行闡述:
(1)實現Runnable介面(推薦使用這種方法)
我們還是來看一個具體的例子吧,
public class Test implements Runnable{/**如何啟動線程*/ public static void main(String[] args) { Test test = new Test(); Thread t = new Thread(test); //執行個體化一個線程對象的方法,使用start方法 t.start();//調用線程的start方法,表示啟動線程;線程啟動後,自動會調用Test類的run方法 } /**實現Runnable介面的run方法*/public void run() {//在run方法裡面要做的事情、要處理的任務//...}}
(2)繼承Thread類
public class Test extends Thread{/**如何啟動線程*/ public static void main(String[] args) { Test test = new Test(); Thread t = new Thread(test); //執行個體化一個線程對象,使用start方法 t.start();//調用線程的start方法,表示啟動線程;線程啟動後,自動會調用Test類的run方法 } /**實現Runnable介面的run方法*/public void run() {//在run方法裡面要做的事情、要處理的任務//...}}
需要注意的是,繼承Thread類必須重寫Thread類的run方法。
其他