Java多線(xiàn)程并發(fā)與并行和線(xiàn)程與進(jìn)程案例
前言:
程序在沒(méi)有跳轉(zhuǎn)語(yǔ)句的前提下,都是由上至下依次執(zhí)行,那現(xiàn)在想要設(shè)計(jì)一個(gè)程序,邊打游戲邊聽(tīng)歌,怎么設(shè)計(jì)? 要解決上述問(wèn)題,咱們得使用多進(jìn)程或者多線(xiàn)程來(lái)解決.
一、并發(fā)與并行
- 并發(fā):指兩個(gè)或多個(gè)事件在同一個(gè)時(shí)間段內(nèi)發(fā)生。
- 并行:指兩個(gè)或多個(gè)事件在同一時(shí)刻發(fā)生(同時(shí)發(fā)生)。

在操作系統(tǒng)中,安裝了多個(gè)程序,并發(fā)指的是在一段時(shí)間內(nèi)宏觀(guān)上有多個(gè)程序同時(shí)運(yùn)行,這在單 CPU 系統(tǒng)中,每一時(shí)刻只能有一道程序執(zhí)行,即微觀(guān)上這些程序是分時(shí)的交替運(yùn)行,只不過(guò)是給人的感覺(jué)是同時(shí)運(yùn)行,那是因?yàn)榉謺r(shí)交替運(yùn)行的時(shí)間是非常短的。 而在多個(gè) CPU 系統(tǒng)中,則這些可以并發(fā)執(zhí)行的程序便可以分配到多個(gè)處理器上(CPU),實(shí)現(xiàn)多任務(wù)并行執(zhí)行,即利用每個(gè)處理器來(lái)處理一個(gè)可以并發(fā)執(zhí)行的程序,這樣多個(gè)程序便可以同時(shí)執(zhí)行。目前電腦市場(chǎng)上說(shuō)的多核 CPU,便是多核處理器,核 越多,并行處理的程序越多,能大大的提高電腦運(yùn)行的效率。
注意:單核處理器的計(jì)算機(jī)肯定是不能并行的處理多個(gè)任務(wù)的,只能是多個(gè)任務(wù)在單個(gè)CPU上并發(fā)運(yùn)行。同理,線(xiàn)程也是一樣的,從宏觀(guān)角度上理解線(xiàn)程是并行運(yùn)行的,但是從微觀(guān)角度上分析卻是串行運(yùn)行的,即一個(gè)線(xiàn)程一個(gè)線(xiàn)程的去運(yùn)行,當(dāng)系統(tǒng)只有一個(gè)CPU時(shí),線(xiàn)程會(huì)以某種順序執(zhí)行多個(gè)線(xiàn)程,我們把這種情況稱(chēng)之為線(xiàn)程調(diào)度。
二、線(xiàn)程與進(jìn)程
- 進(jìn)程:是指一個(gè)內(nèi)存中運(yùn)行的應(yīng)用程序,每個(gè)進(jìn)程都有一個(gè)獨(dú)立的內(nèi)存空間,一個(gè)應(yīng)用程序可以同時(shí)運(yùn)行多個(gè)進(jìn)程;進(jìn)程也是程序的一次執(zhí)行過(guò)程,是系統(tǒng)運(yùn)行程序的基本單位;系統(tǒng)運(yùn)行一個(gè)程序即是一個(gè)進(jìn)程從創(chuàng)建、運(yùn)行到消亡的過(guò)程。
- 線(xiàn)程:線(xiàn)程是進(jìn)程中的一個(gè)執(zhí)行單元,負(fù)責(zé)當(dāng)前進(jìn)程中程序的執(zhí)行,一個(gè)進(jìn)程中至少有一個(gè)線(xiàn)程。一個(gè)進(jìn)程中是可以有多個(gè)線(xiàn)程的,這個(gè)應(yīng)用程序也可以稱(chēng)之為多線(xiàn)程程序。
簡(jiǎn)而言之:一個(gè)程序運(yùn)行后至少有一個(gè)進(jìn)程,一個(gè)進(jìn)程中可以包含多個(gè)線(xiàn)程
我們可以再電腦底部任務(wù)欄,右鍵----->打開(kāi)任務(wù)管理器,可以查看當(dāng)前任務(wù)的進(jìn)程: 進(jìn)程

線(xiàn)程

線(xiàn)程調(diào)度:
- 分時(shí)調(diào)度:所有線(xiàn)程輪流使用 CPU 的使用權(quán),平均分配每個(gè)線(xiàn)程占用 CPU 的時(shí)間。
- 搶占式調(diào)度:優(yōu)先讓優(yōu)先級(jí)高的線(xiàn)程使用 CPU,如果線(xiàn)程的優(yōu)先級(jí)相同,那么會(huì)隨機(jī)選擇一個(gè)(線(xiàn)程隨機(jī)性),Java使用的為搶占式調(diào)度。
- 設(shè)置線(xiàn)程的優(yōu)先級(jí)

搶占式調(diào)度詳解:
大部分操作系統(tǒng)都支持多進(jìn)程并發(fā)運(yùn)行,現(xiàn)在的操作系統(tǒng)幾乎都支持同時(shí)運(yùn)行多個(gè)程序。比如:現(xiàn)在我們上課一邊使用編輯器,一邊使用錄屏軟件,同時(shí)還開(kāi)著畫(huà)圖板,dos窗口等軟件。此時(shí),這些程序是在同時(shí)運(yùn)行,”感覺(jué)這些軟件好像在同一時(shí)刻運(yùn)行著“。 實(shí)際上,CPU(中央處理器)使用搶占式調(diào)度模式在多個(gè)線(xiàn)程間進(jìn)行著高速的切換。對(duì)于CPU的一個(gè)核而言,某個(gè)時(shí)刻,只能執(zhí)行一個(gè)線(xiàn)程,而 CPU的在多個(gè)線(xiàn)程間切換速度相對(duì)我們的感覺(jué)要快,看上去就是在同一時(shí)刻運(yùn)行。 其實(shí),多線(xiàn)程程序并不能提高程序的運(yùn)行速度,但能夠提高程序運(yùn)行效率,讓CPU的使用率更高。

三、創(chuàng)建線(xiàn)程類(lèi)
Java使用java.lang.Thread類(lèi)代表線(xiàn)程,所有的線(xiàn)程對(duì)象都必須是Thread類(lèi)或其子類(lèi)的實(shí)例。每個(gè)線(xiàn)程的作用是完成一定的任務(wù),實(shí)際上就是執(zhí)行一段程序流即一段順序執(zhí)行的代碼。Java使用線(xiàn)程執(zhí)行體來(lái)代表這段程序流。Java中通過(guò)繼承Thread類(lèi)來(lái)創(chuàng)建并啟動(dòng)多線(xiàn)程的步驟如下:
- 定義Thread類(lèi)的子類(lèi),并重寫(xiě)該類(lèi)的run()方法,該run()方法的方法體就代表了線(xiàn)程需要完成的任務(wù),因此把run()方法稱(chēng)為線(xiàn)程執(zhí)行體。
- 創(chuàng)建Thread子類(lèi)的實(shí)例,即創(chuàng)建了線(xiàn)程對(duì)象
- 調(diào)用線(xiàn)程對(duì)象的start()方法來(lái)啟動(dòng)該線(xiàn)程
代碼如下: 測(cè)試類(lèi):
public class Demo01 {
public static void main(String[] args) {
//創(chuàng)建自定義線(xiàn)程對(duì)象
MyThread mt = new MyThread("新的線(xiàn)程!");
//開(kāi)啟新線(xiàn)程
mt.start();
//在主方法中執(zhí)行for循環(huán)
for (int i = 0; i < 10; i++) {
System.out.println("main線(xiàn)程!"+i);
}
}
}自定義線(xiàn)程類(lèi):
public class MyThread extends Thread {
//定義指定線(xiàn)程名稱(chēng)的構(gòu)造方法
public MyThread(String name) {
//調(diào)用父類(lèi)的String參數(shù)的構(gòu)造方法,指定線(xiàn)程的名稱(chēng)
super(name);
}
/**
* 重寫(xiě)run方法,完成該線(xiàn)程執(zhí)行的邏輯
*/
@Override
public void run() {
for (int i = 0; i < 10; i++) {
System.out.println(getName()+":正在執(zhí)行!"+i);
}
}
}到此這篇關(guān)于Java多線(xiàn)程并發(fā)與并行和線(xiàn)程與進(jìn)程案例的文章就介紹到這了,更多相關(guān)Java多線(xiàn)程內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Java開(kāi)發(fā)druid數(shù)據(jù)連接池maven方式簡(jiǎn)易配置流程示例
本篇文章主要為大家介紹了java開(kāi)發(fā)中druid數(shù)據(jù)連接池maven方式的簡(jiǎn)易配置流程示例,文中附含詳細(xì)的代碼示例,有需要的朋友可以借鑒參考下,希望能夠有所幫助2021-10-10
Java try catch finally異常處理組合詳解
這篇文章主要介紹了Java try catch finally異常處理組合詳解,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-05-05
Spring?Boot中application配置文件的生效順序及應(yīng)用范圍
Spring?Boot的一個(gè)重要特性就是它的自動(dòng)配置,這一特性在很大程度上依賴(lài)于名稱(chēng)為application的配置文件,本文將詳細(xì)介紹在Spring?Boot中,這些配置文件的加載順序以及每份文件的應(yīng)用范圍,需要的朋友可以參考下2024-03-03
Spring?WebMVC初始化Controller流程詳解
這篇文章主要介紹了Spring?WebMVC初始化Controller流程,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-02-02
淺談SpringCloud的微服務(wù)架構(gòu)組件
這篇文章主要介紹了淺談SpringCloud的微服務(wù)架構(gòu)組件,Spring Cloud根據(jù)分布式服務(wù)協(xié)調(diào)治理的需求成立了許多子項(xiàng)目,每個(gè)項(xiàng)目通過(guò)特定的組件去實(shí)現(xiàn),需要的朋友可以參考下2023-04-04
解決SpringBoot集成Eureka導(dǎo)致返回結(jié)果由json變?yōu)閤ml的問(wèn)題
這篇文章主要介紹了解決SpringBoot集成Eureka導(dǎo)致返回結(jié)果由json變?yōu)閤ml的問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-07-07
java中如何判斷數(shù)組中是否包含某個(gè)元素的幾種方法
相信大家在操作Java的時(shí)候,經(jīng)常會(huì)要檢查一個(gè)數(shù)組(無(wú)序)是否包含一個(gè)特定的值,這篇文章主要給大家介紹了關(guān)于java中如何判斷數(shù)組中是否包含某個(gè)元素的幾種方法,需要的朋友可以參考下2024-08-08

