【JavaEE】認識多線程

作者主頁:paper jie_博客

本文作者:大家好,我是paper jie,感謝你閱讀本文,歡迎一建三連哦。

本文錄入于《vaEE》專欄,本專欄是針對于大學生,編程小白精心打造的。筆者用重金(時間和精力)打造,將MySQL基礎知識一網打盡,希望可以幫到讀者們哦。

其他專欄:《MySQL》《C語言》《javaSE》《數據結構》等

內容分享:本期將會分享多線程知識~

前言

在上篇文章中,我們提到了多進程這個概念,通過多進程我們就可以同時多次運行多個程序了.但是,這這里其實還是有一個比較明顯的缺點.就是進程在創建的時候需要申請資源,銷毀的時候需要釋放資源.這就會導致開銷比較大.再這個前提下,就延伸出了多線程這個概念.

多線程

什么是多線程

多線程也可以叫輕量級進程.一個進程是可以包含多個線程的,且至少得有一個線程.線程也可以單獨執行,每個線程都有一個自己的PCB,有一些支持調度的重要屬性,比如狀態,優先級,記賬信息,上下文等. 多線程主要就是為了解決進程申請資源和釋放資源開銷大的這個問題.且它也可以提高一個進程的效率.多線程是Java常用的編程方式.

為什么多線程可以解決多進程開銷大的問題

這是因為一個進程中的所有線程他們的資源是共享的.隨著進程創建好,第一個線程也隨著創建好了,第一個線程創建的時候會申請好資源,再后面隨著創建好的線程都會共用這份資源.這樣就意味著,除了第一個線程需要申請和釋放資源外,其他的線程都不用在申請資源了.但這不是隨便兩個線程就可以共享.這需要一組相關的線程才可以,這就叫做線程組.

如果在深究下去的話,為什么它們能資源共享?這是因為線程中會有內存指針這樣的屬性,它們的內存指正指向的都是同一塊內存,這塊內存就是第一個線程申請過來的.硬盤資源也是如此,它們也會有一個文件操作符表,是用來操作硬盤資源的.它們表示的也是同一份硬盤資源.?

這里就可以得出一個概念: 在多線程中,進程是分配資源的基本單位. 線程是調度執行的基本單位.

多線程的缺點?

多線程也不是十全十美的,它也有一些缺點.線程不是越多越好,太多了會導致調度開銷比較大. 且進程與進程之間是相互獨立的,但是多線程中,一個線程掛了,這個進程中的其他線程有可能也會隨著異常中斷.

進程與線程的區別?

1. 一個進程包含多個線程,且最少有一個線程.

2. 進程是資源分配的基本單位,線程是調度執行的基本單位.

3. 進程間的資源是獨立的,但一個進程內的線程是共享資源的.

4.線程也是一單獨的執行流,它也有PCB,里面也有狀態,優先級,記賬信息,上下文

5. 進程與進程間是相互獨立,互不干擾的.但是一個進程中,一個線程掛了,其他線程也可能異常中斷.

6. 線程不是越多越好,需要適量.不然調度開銷會比較大.

7. 線程與線程間可能會相互干擾,會有線程安全問題.

Java中的多線程

線程是操作系統的概念.操作系統內核中實現了線程這樣的概念.且對用戶提供了統一的API供用戶使用.但是這些API大多是拿C/C++寫的.在這個前提下,Java標準庫中對操作系統的API進行了進一步的抽象與封裝. 在Java中表示線程就是用Thread這個類.

第一個多線程程序

Thread就是Java提供的API.在創建一個類后需要繼承Thread,再重寫他的run方法.run方法是這個線程的入口. 還需要創建實例,這才是一個線程.最后需要使用start方法,它是真正的在內核中創建了線程.

class MyThread extends Thread {@Override//run方法就是這個線程的入口方法public void run() {System.out.println("進去執行啦");}
}public class ThreadDemo {public static void main(String[] args) {//創建實例 線程實例才是真正的線程MyThread myThread = new MyThread();//開始執行 調用Thread的start才是真正的調用系統 api,在系統內核中創建線程myThread.start();}
}

什么是內核

內核就是用來管理管理硬件資源,為軟件提供穩定的運行環境.操作系統可以簡單的認為是 內核 + 配套的應用程序. 操作系統里面分為內核態和用戶態.一般我們的應用程序都是運行在用戶態中.但再需要使用硬件資源時,不能直接對硬件資源操作,就需要通過操作系統提供的API進一步在內核中操作.

為什么要劃分出內核態和用戶態

目的就是為了穩定.為了防止程序把硬件資源,軟件資源搞壞了.系統提供的API是合法的.應用程序只能調用這些API,就不會對操作系統或資源造成極大的傷害. 因為在一些極端的情況下程序直接操作硬件可以會將硬件燒壞.

我們可以將操作系統想象成銀行,辦事窗口是內核區,大廳是用戶區.大廳的滑稽需要存錢或者取錢需要通過窗口的工作人員來處理,不能自己直接進去拿.

多線程與普通程序的區別

多線程和普通程序的區別就是每個線程都是一個獨立的執行流,他們都是并發執行的,并不是順序執行代碼.

栗子:

class MyThread extends Thread {@Overridepublic void run() {while(true) {System.out.println("hello Thread");try {Thread.sleep(1000);} catch (InterruptedException e) {throw new RuntimeException(e);}}}
}
public class ThreadDemo1 {public static void main(String[] args) {Thread t = new MyThread();t.start();while(true) {System.out.println("hello main");try {Thread.sleep(1000);} catch (InterruptedException e) {throw new RuntimeException(e);}}}
}

通過代碼執行打印效果,我們可以發現并不是先打印hello THread在打印 hello main,而是同時執行打印,且是隨機的.因為內核中有一個調度器模塊.實現方式就是隨機調度的效果.

使用jconsole命令觀察線程

在本地上找到jbk的bin,再找到jconsole這個可執行文件,雙擊打不來可以用管理員運行方式打開.

我們可以在線程這一欄中觀察我們創建的線程.?


本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/166884.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/166884.shtml
英文地址,請注明出處:http://en.pswp.cn/news/166884.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

React + BraftEditor 實現富文本編輯

Braft Editor 是一個基于 React 和 Draft-js 開發的富文本編輯器,提供了豐富的基礎功能,如基本文本格式化、列表、鏈接、圖片上傳、視頻插入等,并且還支持擴展。 首先,確保你已經在項目中安裝了 Braft Editor 和它的依賴項&#x…

NPU、CPU、GPU算力及算力計算方式

NVIDIA在9月20日發布的NVIDIA DRIVE Thor 新一代集中式車載計算平臺,可在單個安全、可靠的系統上運行高級駕駛員輔助應用和車載信息娛樂應用。提供 2000 萬億次浮點運算性能(2000 萬億次8位浮點運算)。NVIDIA當代產品是Orin,算力是…

Java基礎(問題+答案)——第4期

其他的幾期見這個專欄 Java中的多態性(Polymorphism): 多態性是指一個對象可以用來引用多個類型的特性。在Java中,多態性通過方法的重寫和接口實現來實現。 Java中的final關鍵字的用途: final可以用于變量、方法和類。…

堪比數據恢復大師軟件推薦,恢復數據很簡單!

“作為一個經常丟失數據的電腦用戶來說,我覺得我非常需要一些簡單有效的數據恢復方法。大家有什么比較靠譜的軟件推薦嗎?非常感謝!” 在數字化時代,數據的存儲是比較重要的。很多用戶都會選擇將重要的文件保存在電腦上。如果數據丟…

第二證券:北證50指數一枝獨秀 短劇游戲概念股持續活躍

周三,滬深兩市三大指數顫動調整,北證50指數“鶴立雞群”,大漲超8%。到收盤,上證綜指報3043.61點,跌0.79%;深證成指報9855.66點,跌1.41%;創業板指報1950.01點,跌1.73%。滬…

ITSS項目概述及評估流程!

ITSS項目概述 ITSS (Information Technology Service Standards,信息技術服務標準,簡稱ITSS)是一套成體系和綜合配套的信息技術服務標準庫,全面規范了IT服務產品及其組成要素,用于指導實施標準化和可信賴的IT服務,是套…

CSV用EXCEL打開后為科學計數法(后幾位丟失)解決方法

當在Excel中打開含有長數字(如訂單號)的CSV文件時,Excel可能會默認將這些長數字格式化為科學計數法。 而當您嘗試將它們轉換為文本格式時,如果數字非常長,Excel可能無法正確處理其精度,導致數字的后幾位變…

uni-app,nvue中text標簽文本超出寬度不換行問題解決

復現:思路: 將text標簽換為rich-text,并給rich-text增加換行的樣式class類名解決:

GPT寫SQL的模版

表:profit_loss_sum_m_snapshot 計算字段:成本cost_whole求和,收入income_whole求和,收入求和-成本求和,成本目標cost_target求和,收入求和-成本目標求和 條件:日期statis_date在2023-11-01&…

【Vue】瀏覽器安裝vue插件

首先看一下安裝之后的效果&#xff0c;再考慮一下要不要安裝 安裝完之后&#xff0c;打開瀏覽器控制臺&#xff08;ctrl shift j) <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>Title</t…

HOOPS Web平臺助力開發3D應用,實現超大規模3D web輕量化渲染與數據格式轉換!

一、包含的軟件開發工具包 HOOPS Web平臺幫助開發人員構建基于Web的工程應用程序&#xff0c;提供高級3D Web可視化、準確快速的CAD數據訪問和3D數據發布。 HOOPS Web平臺包括三個集成軟件開發工具包 (SDK)&#xff1a; &#xff08;1&#xff09;Web端3D可視化引擎 HOOPSCom…

mysql查詢表的字段,字段名以及注釋sql語句

sql語句如下&#xff1a; selecta.ordinal_position 序號,a.COLUMN_name 字段名,a.COLUMN_type 字段類型,(case a.is_nullable when NO then 是 else 否 end) 是否非空,(case a.column_key when PRI then 是 else 否 end) 是否主鍵,a.COLumn_comment 注釋 frominformation_sch…

【C/C++】素數專題

素數專題 1.判斷素數模板2.求范圍內的素數&#xff08;101-200&#xff09;3.判斷素數與分解 1.判斷素數模板 #include<stdio.h> #include<math.h>int prism(int n){if(n1) return 0;for(int i2;i<sqrt(n);i){if(n%i0) return 0;}return 1; }int main() {int n…

Doris中的物化視圖(十八)

物化視圖就是包含了查詢結果的數據庫對象&#xff0c;可能是對遠程數據的本地 copy&#xff0c;也可能是一個表或多表 join 后結果的行或列的子集&#xff0c;也可能是聚合后的結果。說白了&#xff0c;就是預先存儲查詢結果的一種數據庫對象。 在 Doris 中的物化視圖&#xf…

【深度學習】P1 數據缺失值預處理

數據缺失值預處理 創建數據集展示數據集缺失值處理 創建數據集 首先創建一個人工數據集&#xff0c;作為下文對數據缺失值預處理的案例&#xff0c; import osos.makedirs(os.path.join(.., data), exist_okTrue) data_file os.path.join(.., data, house_tiny.csv) with op…

SIP協議在語音通信的應用方式

在企業語音通信的過程中&#xff0c;SIP協議支持的網絡通信技術通過網絡為用戶提供了無數的通信便利&#xff0c;已成為企業不可或缺的重要通信技術。由于SIP協議是語音通信幫助企業實現這些優勢的原因&#xff0c;因此了解支持這些呼叫的SIP協議的上下文至關重要。 什么是SIP?…

Duplicate 模型中的 ROLLUP(十六)

因為 Duplicate 模型沒有聚合的語意。所以該模型中的 ROLLUP&#xff0c;已經失去了“上卷”這一層含義。而僅僅是作為調整列順序&#xff0c;以命中前綴索引的作用。下面詳細介紹前綴索引&#xff0c;以及如何使用 ROLLUP 改變前綴索引&#xff0c;以獲得更好的查詢效率。 前…

微服務保護 Sentinel

1.初識Sentinel 文章目錄 1.初識Sentinel1.1.雪崩問題及解決方案1.1.1.雪崩問題1.1.2.超時處理1.1.3.倉壁模式1.1.4.斷路器1.1.5.限流1.1.6.總結 1.2.服務保護技術對比1.3.Sentinel介紹和安裝1.3.1.初識Sentinel1.3.2.安裝Sentinel 1.4.微服務整合Sentinel 2.流量控制2.1.簇點鏈…

C語言—指針初始化

指針初始化&#xff1a;指針初始情況下指向哪個地址。兩種指針初始化方式 1、聲明指針時就進行指針初始化&#xff0c;告訴指針指向哪個地址 #include <stdio.h> int main () {int i5;int *p&i;return 0; }2、聲明指針時未進行初始化&#xff0c;在后期把指向的地…

MacM1(ARM)安裝Protocol Buffers

MacM1(ARM)安裝Protocol Buffers 本文目錄 MacM1(ARM)安裝Protocol Buffers3.21之前版本安裝使用configure3.22之后版本安裝使用cmake使用編譯后的版本 protobuf下載地址&#xff1a;https://github.com/protocolbuffers/protobuf/releases 在運行./autogen.sh或./configure命…