??博客主頁:?【小扳_-CSDN博客】
?感謝大家點(diǎn)贊??收藏?評論?
文章目錄
? ? ? ? 1.0 進(jìn)程概述
? ? ? ? 2.0 線程概述
? ? ? ? 2.1 多線程概述
? ? ? ? 3.0 常見的面試題:談?wù)勥M(jìn)程與線程的區(qū)別
? ? ? ? 4.0 Java 實(shí)現(xiàn)多線程的常見方法
? ? ? ? 4.1 實(shí)現(xiàn)多線程方法 - 繼承 Thread 類
? ? ? ? 4.2?實(shí)現(xiàn)多線程方法 - 實(shí)現(xiàn) Runnable?接口
? ? ? ? 1.0 進(jìn)程概述
????????一個(gè)程序運(yùn)行起來,就會(huì)對應(yīng)一個(gè)進(jìn)程,進(jìn)程是系統(tǒng)分配資源的基本單位。每個(gè)進(jìn)程都有自己的地址空間、代碼、數(shù)據(jù)、堆棧等資源,可以獨(dú)立運(yùn)行并與其他進(jìn)程隔離。
進(jìn)程特點(diǎn):
? ? ? ? 1)進(jìn)程是程序的執(zhí)行實(shí)例,是計(jì)算機(jī)系統(tǒng)中最基本的執(zhí)行單位。
? ? ? ? 2)每個(gè)進(jìn)程有自己的地址空間、資源和狀態(tài),相互獨(dú)立運(yùn)行,互不干擾。
進(jìn)程的狀態(tài):
? ? ? ? 1)就緒態(tài)(Ready):進(jìn)程已經(jīng)準(zhǔn)備好運(yùn)行,等待系統(tǒng)分配處理器資源。
? ? ? ? 2)運(yùn)行態(tài)(Running):進(jìn)程正在執(zhí)行指令,占用處理器資源。
? ? ? ? 3)阻塞態(tài)(Blocked):進(jìn)程因等待某些事件發(fā)生而暫時(shí)停止運(yùn)行。
? ? ? ? 4)終止態(tài)(Terminated):進(jìn)程執(zhí)行完畢或被終止,釋放資源。
? ? ? ? 2.0 線程概述
????????是進(jìn)程中的實(shí)際執(zhí)行單元。線程是系統(tǒng)調(diào)度執(zhí)行的基本單位。一個(gè)進(jìn)程可以包含一個(gè)或多個(gè)線程,共享進(jìn)程的資源,但每個(gè)線程有自己的??臻g和執(zhí)行路徑。
線程特點(diǎn):
? ? ? ? 1)線程是進(jìn)程中的執(zhí)行單元,可以看作是輕量級的進(jìn)程。
? ? ? ? 2)同一進(jìn)程中的線程共享進(jìn)程的地址空間和資源,可以直接訪問進(jìn)程的全局變量和數(shù)據(jù)。線程共享進(jìn)程的資源,減少資源的重復(fù)占用,提高資源的利用效率。
? ? ? ? 3)線程之間的切換比進(jìn)程之間的切換更快速,因?yàn)榫€程共享相同的地址空間。
線程的狀態(tài):
? ? ? ? 1)就緒態(tài)(Ready):進(jìn)程已經(jīng)準(zhǔn)備好運(yùn)行,等待系統(tǒng)分配處理器資源。
? ? ? ? 2)運(yùn)行態(tài)(Running):進(jìn)程正在執(zhí)行指令,占用處理器資源。
? ? ? ? 3)阻塞態(tài)(Blocked):進(jìn)程因等待某些事件發(fā)生而暫時(shí)停止運(yùn)行。
? ? ? ? 4)終止態(tài)(Terminated):進(jìn)程執(zhí)行完畢或被終止,釋放資源。
? ? ? ? 2.1 多線程概述
????????多線程是指在一個(gè)程序中同時(shí)執(zhí)行多個(gè)線程,每個(gè)線程可以獨(dú)立執(zhí)行不同的任務(wù)或操作。在Java中,多線程可以讓程序更高效地利用計(jì)算機(jī)的多核處理器,提高程序的性能和響應(yīng)速度。
? ? ? ? 3.0 常見的面試題:談?wù)勥M(jìn)程與線程的區(qū)別
? ? ? ? 1)資源占用方面上的區(qū)別:
? ? ? ? 進(jìn)程擁有獨(dú)立的地址空間和資源,進(jìn)程與進(jìn)程之間相互獨(dú)立,即使一個(gè)進(jìn)程出現(xiàn)了某些因素的影響,不能運(yùn)行了,另一個(gè)進(jìn)程也不會(huì)受到影響。
? ? ? ? 線程共享所屬進(jìn)程的地址和資源,包括全局變量、棧空間等,線程之間可以直接通信。若在一個(gè)進(jìn)程中有若個(gè)線程中,即使只有一個(gè)線程出現(xiàn)問題,那么所有的線程都有可能會(huì)收到影響。
? ? ? ? 2)通信和同步方面上:
? ? ? ? ?進(jìn)程通信比較復(fù)雜,需要使用 IPC 機(jī)制,如管道、消息隊(duì)列、共享內(nèi)存等。
? ? ? ? 線程之間共享進(jìn)程的資源,可以直接訪問全局變量,線程通信更加方便。
? ? ? ? 3)切換開銷方面上的區(qū)別:
? ? ? ? 進(jìn)程切換的開銷比較大,需要保存和恢復(fù)整個(gè)進(jìn)程的狀態(tài),包括內(nèi)存映像、寄存器等。
? ? ? ? 線程切換的開銷比較小,因?yàn)榫€程共享進(jìn)程的資源,只需要保存和回復(fù)線程的稀有數(shù)據(jù)。
舉個(gè)例子:
線程與進(jìn)程的區(qū)別:
? ? ? ? 4.0 Java 實(shí)現(xiàn)多線程的常見方法
? ? ? ? 1)繼承 Thread 類。2)實(shí)現(xiàn) Runnable 接口。
? ? ? ? 4.1 實(shí)現(xiàn)多線程方法 - 繼承 Thread 類
? ? ? ? 先創(chuàng)建一個(gè)類繼承 Thread 類,重寫 run 方法。還需要在主函數(shù)中利用 start 方法啟動(dòng)。這樣就創(chuàng)建了一個(gè)線程,調(diào)用 start 方法之后,系統(tǒng)會(huì)自動(dòng)調(diào)用重寫的 run 方法,也就是回調(diào)函數(shù)。交給系統(tǒng)執(zhí)行 run 方法。
????????在 mian 中也是一個(gè)線程,稱為主線程,主線程是自動(dòng)創(chuàng)建的,而 thread 線程則是我們手動(dòng)創(chuàng)建出來的。
代碼如下:
public class demo1 { public static void main(String[] args) { Thread thread = new MyThread(); thread.start(); while (true){ System.out.println("正在執(zhí)行主線程"); } } } class MyThread extends Thread{ @Override public void run() { while (true){ System.out.println("正在執(zhí)行 run 線程"); } } }
運(yùn)行結(jié)果:
以上代碼和運(yùn)行結(jié)果都是多線程所展示的,接下來對比一下單線程代碼和運(yùn)行結(jié)果:
public class demo1 { public static void main(String[] args) { Thread thread = new MyThread(); thread.run(); while (true){ System.out.println("正在執(zhí)行主線程"); } } } class MyThread extends Thread{ @Override public void run() { while (true){ System.out.println("正在執(zhí)行 run 線程"); } } }
? ? ? ? 注意觀察,這里沒有用到 start 方法,那么就意味著沒有創(chuàng)建新的線程當(dāng)前是主線程。因?yàn)闆]有創(chuàng)建新的線程,所以就不會(huì)有系統(tǒng)自動(dòng)調(diào)用重寫的 run 方法,那么我們自己手動(dòng)調(diào)用 run 方法也是可以的,不過還是在同一個(gè)線程里面,并沒有創(chuàng)建新的線程。因此,這里只能輸出 "正在執(zhí)行 run 線程" 這條語句,只能等到這循環(huán)結(jié)束后,才會(huì)執(zhí)行下一個(gè)循環(huán),因?yàn)樵谕粋€(gè)線程里面,不能多并行。
運(yùn)行結(jié)果:
? ? ? ? 除了以上方法可以看出來是否是多線程代碼,還可以用到 jconsole.exe 這個(gè)應(yīng)用程序,直觀的感受出來。還是用到以上的多線程代碼,來觀察:
進(jìn)入的頁面找到相應(yīng)的 .java 文件:
進(jìn)入后,可以看到一個(gè) java 應(yīng)用程序運(yùn)行的時(shí)候,至少有?15 個(gè)線程:?
可以我們手動(dòng)創(chuàng)建的線程 Thread-0 還有自動(dòng)創(chuàng)建的主線程:
? ? ? ? 剩下的線程都是 jvm 幫我們做的一些其他工作,涉及到的負(fù)責(zé)垃圾回收的,負(fù)責(zé)記錄調(diào)試信息的......
詳細(xì)補(bǔ)充:
? ? ? ? 1)start 方法調(diào)用操作系統(tǒng)提供的“創(chuàng)建線程”的 API ,在內(nèi)核中創(chuàng)建對應(yīng) PCB ,并且把 PCB 加入到鏈表中。run 方法則是在進(jìn)一步的系統(tǒng)調(diào)度到這個(gè)線程了之后,系統(tǒng)自動(dòng)就會(huì)執(zhí)行上訴 run 方法中的邏輯。
? ? ? ? 2)多線程的調(diào)度順序是無序的,在操作系統(tǒng)內(nèi)部也稱為“搶占式執(zhí)行”。任何一個(gè)線程,在執(zhí)行到任何一個(gè)代碼的過程中,都可以被其他線程搶占掉它的 cpu 資源,于是 cup 就給別的線程執(zhí)行了。這樣的搶占式執(zhí)行,充滿了隨機(jī)性,正是這樣的隨機(jī)性,使多線程的程序,執(zhí)行效果,也會(huì)難以預(yù)測,甚至可以會(huì)引入 bug 。
????????除了以上的寫法之外,還有用匿名內(nèi)部類形式。
代碼如下:
public class demo2 { public static void main(String[] args) { Thread thread = new Thread(){ @Override public void run() { while(true){ System.out.println("正在運(yùn)行 run 方法"); } } }; thread.start(); while (true){ System.out.println("正在運(yùn)行 main 方法"); } } }
還可以用 lambda 方式進(jìn)行進(jìn)一步的簡化:
public class demo2 { public static void main(String[] args) { Thread thread = new Thread(() -> { while (true){ System.out.println("正在運(yùn)行 run 方法"); } }); thread.start(); while (true){ System.out.println("正在運(yùn)行 main 方法"); } } }
? ? ? ? 4.2?實(shí)現(xiàn)多線程方法 - 實(shí)現(xiàn) Runnable?接口
? ? ? ? 為了提高代碼的靈活性,可以將線程的任務(wù)與線程本身分離,使代碼結(jié)構(gòu)更清晰。
? ? ? ? 先實(shí)現(xiàn) Runnable 接口,一樣的需要重寫 run 方法,再把這個(gè)實(shí)例作為參數(shù)傳入到創(chuàng)建 Thread 類中。最后調(diào)用 start 方法啟動(dòng)線程。
代碼如下:
public class demo3 { public static void main(String[] args) { Thread thread = new Thread(new MyRunnable()); thread.start(); while (true){ System.out.println("正在運(yùn)行 main 方法"); } } } class MyRunnable implements Runnable{ @Override public void run() { while (true){ System.out.println("正在運(yùn)行 run 方法"); } } }
同樣也可以用匿名類內(nèi)部類方式:文章來源:http://www.zghlxwxcb.cn/news/detail-850276.html
public class demo4 { public static void main(String[] args) { Thread thread = new Thread(()-> { while(true) { System.out.println("正在運(yùn)行 run 方法"); } }); thread.start(); while (true){ System.out.println("正在運(yùn)行 main 方法"); } } }
文章來源地址http://www.zghlxwxcb.cn/news/detail-850276.html
到了這里,關(guān)于JavaEE 初階篇-深入了解進(jìn)程與線程(常見的面試題:進(jìn)程與線程的區(qū)別)的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!