JavaEE的進程,線程和創(chuàng)建線程的5種方式詳解
一、認識進程、線程
1.1什么是進程
進程process/task.“進程"是計算機完成一個工作的"過程”
設(shè)備上一個正在運行的程序,就是一個進程。比如你打開的QQ就是一個進程,正在和別人聊天的微信也是一個進程。進程是系統(tǒng)進行資源分配的基本單位。
當我們打開任務(wù)管理器就可以看到,當前操作系統(tǒng)中正在運行的進程。
要想讓一個進程真正的運行起來,就需要給這個進程分配一定的系統(tǒng)硬件資源。這些資源都包括:
CPU:例如我電腦中任務(wù)管理器占用了11%的CPU,QQ占用0.3%。
內(nèi)存:任務(wù)管理器占用了45.7MB。Microsoft Edge占用了320.0MB
磁盤:qq使用的了0.2MB/秒。
網(wǎng)絡(luò)帶寬…
在舉一個例子:我是班長,老師想讓我組織一個活動,我要想組織這個活動,我就需要向老師申請一些活動經(jīng)費、人員調(diào)用。這里我就相當于進程。老師就是CPU。我組織活動的時候向老師申請經(jīng)費、人。就是在請求分配一些資源。有經(jīng)費,有人才能把活動做好。
進程的管理
管理=描述(PCB)+組織
進程的組織:
使用一定的數(shù)據(jù)結(jié)構(gòu)來組織。常見的做法是用一雙向鏈表。 當你查看進程列表都有哪些進程時,本質(zhì)上就是遍歷操作系統(tǒng)內(nèi)核中的這個組織進程的鏈表,再顯示出每個進程的這些屬性。創(chuàng)建一個進程,本質(zhì)上就是創(chuàng)建了一個PCB對象,把這個對象加入到內(nèi)核的鏈表中。銷毀一個進程,本質(zhì)上就是把這個PCB對象從內(nèi)核鏈表中刪除。
進程的描述:
PCB描述進程。這個PCB實際上是一個非常大的結(jié)構(gòu)體,屬性有很多,例如:PID(下表第二列)、內(nèi)存指針、文件描述符表、進程的狀態(tài)、上下文、優(yōu)先級、記賬信息等等。
PID: 一個進程的身份標識,一個機器同一時刻每個進程的PID是唯一的。
內(nèi)存指針: 描述這個進程使用的內(nèi)存空間是哪個范圍
文件描述附表: 描述這個進程都打開了哪些文件
進程的調(diào)度
說到進程,就會涉及到進程的調(diào)度,剛才可以看到我電腦上的進程是非常多的,雖然應(yīng)用那里只顯示了5個,但是后臺還是幫我運行了87個進程。相信大家的電腦一定沒有這么多CPU吧。CPU數(shù)目是少于進程數(shù)目的,但是我又需要讓那些進程“同時執(zhí)行”。我們的系統(tǒng)是支持多任務(wù)的系統(tǒng)。而這個多任務(wù)系統(tǒng)其實就是基于進程調(diào)度這樣的機制來完成的。
并發(fā)式執(zhí)行
舉個例子:假設(shè)有小張同學(xué),他長的很好看,在學(xué)校里有很多的追求者。 按正常男人的標準,我同時只能和一個女生交往~
那小張同學(xué)有沒有辦法做到同時和多個女生交往呢? 小張同學(xué)前思后想,最終決定!安排一個時間表?。?!
周一早上:和A女生一起吃早飯
周二下午:和B女生一起逛街
周三晚上:和C女生一起看電影
只要小張把時間表安排好,這三個女生就不會知道其他兩個人的存在。
從宏觀上來看,(一年)小張同學(xué)同時和三個女生交往。渣男
從微觀上來看,(一天)小張同學(xué)同一時刻只是和一個女生交往。好男人。
換到電腦上操作系統(tǒng)就是這樣管理進程的。
只不過現(xiàn)實中CPU運行速度太快,我們感受不到。我們覺得好像CPU是同時在運行這么多進程一樣。
進程的優(yōu)先級:安排時間表的時候優(yōu)先給誰安排
進程的上下文:將寄存器的信息保存到內(nèi)存中。記錄上次運行到哪個指令,下次再調(diào)度的時候就可以很方便的繼續(xù)從這個位置執(zhí)行??梢岳斫鉃閱螜C游戲的存檔,讀檔。
進程的記賬信息:記錄這個進程在CPU上執(zhí)行了多久,用來輔助決定這個進程是否要繼續(xù)執(zhí)行還是說要調(diào)度出去。
1.2認識線程
為什么需要線程?
我們引入進程的目的,就是為了能夠"并發(fā)編程"。為了同時運行多個程序,雖然多進程已經(jīng)能夠并發(fā)進程了,但是多進程還是有一定的提升空間。
創(chuàng)建進程、銷毀進程、調(diào)度進程這些操作的開銷有點太大了。 為此,引入了線程。
線程
Thread,在有些系統(tǒng)上也叫做"輕量級進程"。為什么說它輕量呢?
創(chuàng)建線程比創(chuàng)建進程更高效;
銷毀線程比銷毀進程更高效;
調(diào)度線程比調(diào)度進程更高效;
因為創(chuàng)建線程并沒有申請資源,銷毀線程也不需要釋放資源。直接讓線程產(chǎn)生在進程內(nèi)部,公用之前的資源。
線程和進制是包含的關(guān)系。一個進程可以包含多個線程或者一個線程。當創(chuàng)建進程之后,就相當于把資源都分配好了,接著在這個進程里面創(chuàng)建線程,這樣的線程就和之前的進程公用一樣的資源了。
1.3進程、線程之前的區(qū)別和聯(lián)系(面試題)
1、進程是操作系統(tǒng)資源分配的基本單位,線程是操作系統(tǒng)調(diào)度執(zhí)行的基本單位。
2、進程是包含線程的,一個進程可以含有多個線程,也可以含有一個線程。
3、每個進程都有獨立的內(nèi)存空間(虛擬地址空間),同一個進程的多個線程之間,公用這個虛擬地址空間。
創(chuàng)建線程的幾種方式
1、創(chuàng)建自定義類繼承Thread類重寫run方法
/** * Thread是Java標準庫中的一個關(guān)于線程的類 * 常用的方式是自定義一個類繼承Thread類,然后重寫run方法 * 這里的run方法就是線程具體要執(zhí)行的任務(wù)(代碼) */ public class threadDemo1 { public static void main (String[] args) { Thread t=new Thread (); //start方法就會在操作系統(tǒng)中創(chuàng)建一個線程出來。 t.start (); } } class MyThread extends Thread{ @Override public void run(){ System.out.println ("繼承Thread類創(chuàng)建線程"); } }
2、實現(xiàn)Runable接口,重寫run方法
public class threadDemo2 { public static void main (String[] args) { Thread T=new Thread (new myRunable ()); T.start (); } } class myRunable implements Runnable{ @Override public void run(){ System.out.println ("實現(xiàn)Runbale接口,重寫run"); } }
3、繼承Thread類重寫run方法,使用匿名內(nèi)部類的方式
public static void main (String[] args) { Thread t=new Thread (){ @Override public void run(){ System.out.println ("匿名內(nèi)部類"); } }; t.start (); }
4、實現(xiàn)Runable,重寫run方法,使用匿名內(nèi)部類
public static void main (String[] args) { Thread t=new Thread (new Runnable () { @Override public void run () { System.out.println ("實現(xiàn)Runable,重寫run,使用匿名內(nèi)部類"); } }); t.start (); }
5、使用lambda表達式
// Thread t3 = new Thread(() -> System.out.println("使用匿名類創(chuàng)建 Thread 子類對象")); Thread t4 = new Thread(() -> { System.out.println("使用匿名類創(chuàng)建 Thread 子類對象"); });
總結(jié)
本篇文章就到這里了,希望能夠給你帶來幫助,也希望您能夠多多關(guān)注腳本之家的更多內(nèi)容!
- java線程池的四種創(chuàng)建方式詳細分析
- Java的線程與進程以及線程的四種創(chuàng)建方式
- 聊聊java多線程創(chuàng)建方式及線程安全問題
- Java線程的三種創(chuàng)建方式
- Java線程創(chuàng)建的四種方式總結(jié)
- 如何在Java中創(chuàng)建線程通信的四種方式你知道嗎
- Java創(chuàng)建線程及配合使用Lambda方式
- java實現(xiàn)/創(chuàng)建線程的幾種方式小結(jié)
- 很多人竟然不知道Java線程池的創(chuàng)建方式有7種
- java 創(chuàng)建線程的四種方式
- Java創(chuàng)建線程的方式解析
相關(guān)文章
Spring+SpringMVC+MyBatis深入學(xué)習及搭建(一)之MyBatis的基礎(chǔ)知識
這篇文章主要介紹了Spring+SpringMVC+MyBatis深入學(xué)習及搭建(一)之MyBatis的基礎(chǔ)知識,需要的朋友可以參考下2017-05-05spring 自動注入AutowiredAnnotationBeanPostProcessor源碼解析
這篇文章主要介紹了spring自動注入AutowiredAnnotationBeanPostProcessor源碼解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2023-03-03Java8之lambda最佳實踐_動力節(jié)點Java學(xué)院整理
在8 里面Lambda是最火的主題,不僅僅是因為語法的改變,更重要的是帶來了函數(shù)式編程的思想,我覺得優(yōu)秀的程序員,有必要學(xué)習一下函數(shù)式編程的思想以開闊思路2017-06-06mybatis的mapper.xml中resultMap標簽的使用詳解
這篇文章主要介紹了mybatis的mapper.xml中resultMap標簽的使用詳解,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習或者工作具有一定的參考學(xué)習價值,需要的朋友們下面隨著小編來一起學(xué)習學(xué)習吧2020-06-06簡單講解Android開發(fā)中觸摸和點擊事件的相關(guān)編程方法
這篇文章主要介紹了Android開發(fā)中觸摸和點擊事件的相關(guān)編程方法,包括事件偵聽器等安卓開發(fā)中常用的接口的基本使用方法,需要的朋友可以參考下2015-12-12