Java多線程并發(fā)與并行和線程與進(jìn)程案例
前言:
程序在沒有跳轉(zhuǎn)語句的前提下,都是由上至下依次執(zhí)行,那現(xiàn)在想要設(shè)計一個程序,邊打游戲邊聽歌,怎么設(shè)計? 要解決上述問題,咱們得使用多進(jìn)程或者多線程來解決.
一、并發(fā)與并行
- 并發(fā):指兩個或多個事件在同一個時間段內(nèi)發(fā)生。
- 并行:指兩個或多個事件在同一時刻發(fā)生(同時發(fā)生)。
在操作系統(tǒng)中,安裝了多個程序,并發(fā)指的是在一段時間內(nèi)宏觀上有多個程序同時運(yùn)行,這在單 CPU 系統(tǒng)中,每一時刻只能有一道程序執(zhí)行,即微觀上這些程序是分時的交替運(yùn)行,只不過是給人的感覺是同時運(yùn)行,那是因?yàn)榉謺r交替運(yùn)行的時間是非常短的。 而在多個 CPU 系統(tǒng)中,則這些可以并發(fā)執(zhí)行的程序便可以分配到多個處理器上(CPU),實(shí)現(xiàn)多任務(wù)并行執(zhí)行,即利用每個處理器來處理一個可以并發(fā)執(zhí)行的程序,這樣多個程序便可以同時執(zhí)行。目前電腦市場上說的多核 CPU,便是多核處理器,核 越多,并行處理的程序越多,能大大的提高電腦運(yùn)行的效率。
注意:單核處理器的計算機(jī)肯定是不能并行的處理多個任務(wù)的,只能是多個任務(wù)在單個CPU上并發(fā)運(yùn)行。同理,線程也是一樣的,從宏觀角度上理解線程是并行運(yùn)行的,但是從微觀角度上分析卻是串行運(yùn)行的,即一個線程一個線程的去運(yùn)行,當(dāng)系統(tǒng)只有一個CPU時,線程會以某種順序執(zhí)行多個線程,我們把這種情況稱之為線程調(diào)度。
二、線程與進(jìn)程
- 進(jìn)程:是指一個內(nèi)存中運(yùn)行的應(yīng)用程序,每個進(jìn)程都有一個獨(dú)立的內(nèi)存空間,一個應(yīng)用程序可以同時運(yùn)行多個進(jìn)程;進(jìn)程也是程序的一次執(zhí)行過程,是系統(tǒng)運(yùn)行程序的基本單位;系統(tǒng)運(yùn)行一個程序即是一個進(jìn)程從創(chuàng)建、運(yùn)行到消亡的過程。
- 線程:線程是進(jìn)程中的一個執(zhí)行單元,負(fù)責(zé)當(dāng)前進(jìn)程中程序的執(zhí)行,一個進(jìn)程中至少有一個線程。一個進(jìn)程中是可以有多個線程的,這個應(yīng)用程序也可以稱之為多線程程序。
簡而言之:一個程序運(yùn)行后至少有一個進(jìn)程,一個進(jìn)程中可以包含多個線程
我們可以再電腦底部任務(wù)欄,右鍵----->打開任務(wù)管理器,可以查看當(dāng)前任務(wù)的進(jìn)程: 進(jìn)程
線程
線程調(diào)度:
- 分時調(diào)度:所有線程輪流使用 CPU 的使用權(quán),平均分配每個線程占用 CPU 的時間。
- 搶占式調(diào)度:優(yōu)先讓優(yōu)先級高的線程使用 CPU,如果線程的優(yōu)先級相同,那么會隨機(jī)選擇一個(線程隨機(jī)性),Java使用的為搶占式調(diào)度。
- 設(shè)置線程的優(yōu)先級
搶占式調(diào)度詳解:
大部分操作系統(tǒng)都支持多進(jìn)程并發(fā)運(yùn)行,現(xiàn)在的操作系統(tǒng)幾乎都支持同時運(yùn)行多個程序。比如:現(xiàn)在我們上課一邊使用編輯器,一邊使用錄屏軟件,同時還開著畫圖板,dos窗口等軟件。此時,這些程序是在同時運(yùn)行,”感覺這些軟件好像在同一時刻運(yùn)行著“。 實(shí)際上,CPU(中央處理器)使用搶占式調(diào)度模式在多個線程間進(jìn)行著高速的切換。對于CPU的一個核而言,某個時刻,只能執(zhí)行一個線程,而 CPU的在多個線程間切換速度相對我們的感覺要快,看上去就是在同一時刻運(yùn)行。 其實(shí),多線程程序并不能提高程序的運(yùn)行速度,但能夠提高程序運(yùn)行效率,讓CPU的使用率更高。
三、創(chuàng)建線程類
Java使用java.lang.Thread
類代表線程,所有的線程對象都必須是Thread類或其子類的實(shí)例。每個線程的作用是完成一定的任務(wù),實(shí)際上就是執(zhí)行一段程序流即一段順序執(zhí)行的代碼。Java使用線程執(zhí)行體來代表這段程序流。Java中通過繼承Thread類來創(chuàng)建并啟動多線程的步驟如下:
- 定義Thread類的子類,并重寫該類的run()方法,該run()方法的方法體就代表了線程需要完成的任務(wù),因此把run()方法稱為線程執(zhí)行體。
- 創(chuàng)建Thread子類的實(shí)例,即創(chuàng)建了線程對象
- 調(diào)用線程對象的start()方法來啟動該線程
代碼如下: 測試類:
public class Demo01 { public static void main(String[] args) { //創(chuàng)建自定義線程對象 MyThread mt = new MyThread("新的線程!"); //開啟新線程 mt.start(); //在主方法中執(zhí)行for循環(huán) for (int i = 0; i < 10; i++) { System.out.println("main線程!"+i); } } }
自定義線程類:
public class MyThread extends Thread { //定義指定線程名稱的構(gòu)造方法 public MyThread(String name) { //調(diào)用父類的String參數(shù)的構(gòu)造方法,指定線程的名稱 super(name); } /** * 重寫run方法,完成該線程執(zhí)行的邏輯 */ @Override public void run() { for (int i = 0; i < 10; i++) { System.out.println(getName()+":正在執(zhí)行!"+i); } } }
到此這篇關(guān)于Java多線程并發(fā)與并行和線程與進(jìn)程案例的文章就介紹到這了,更多相關(guān)Java多線程內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Java構(gòu)建樹形菜單的實(shí)例代碼(支持多級菜單)
這篇文章主要介紹了Java構(gòu)建樹形菜單的實(shí)例代碼(支持多級菜單),非常不錯,具有參考借鑒價值,需要的朋友可以參考下2017-09-09java中l(wèi)ambda表達(dá)式的分析與具體用法
這篇文章主要給大家介紹了關(guān)于java中l(wèi)ambda表達(dá)式具體用法的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2021-04-04IDEA實(shí)用好用插件推薦及使用方法教程詳解(必看)
這篇文章主要介紹了IDEA實(shí)用好用插件推薦及使用方法教程,本文通過實(shí)例截圖相結(jié)合給大家介紹的非常詳細(xì),對大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2020-04-04java實(shí)現(xiàn)周期性執(zhí)行(定時任務(wù))
這篇文章主要為大家詳細(xì)介紹了java實(shí)現(xiàn)周期性執(zhí)行定時任務(wù),文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下2022-09-09java.lang.NoClassDefFoundError錯誤解決辦法
這篇文章主要介紹了java.lang.NoClassDefFoundError錯誤解決辦法的相關(guān)資料,需要的朋友可以參考下2017-06-06Java數(shù)據(jù)結(jié)構(gòu)及算法實(shí)例:快速計算二進(jìn)制數(shù)中1的個數(shù)(Fast Bit Counting)
這篇文章主要介紹了Java數(shù)據(jù)結(jié)構(gòu)及算法實(shí)例:快速計算二進(jìn)制數(shù)中1的個數(shù)(Fast Bit Counting),本文直接給出實(shí)現(xiàn)代碼,代碼中包含詳細(xì)注釋,需要的朋友可以參考下2015-06-06使用Gson將字符串轉(zhuǎn)換成JsonObject和JsonArray
這篇文章主要介紹了使用Gson將字符串轉(zhuǎn)換成JsonObject和JsonArray,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-02-02