摘要:系統(tǒng)級線程核心級線程由操作系統(tǒng)內(nèi)核進行管理。值得注意的是多線程的存在,不是提高程序的執(zhí)行速度。實現(xiàn)多線程上面說了一大堆基礎(chǔ),理解完的話。虛擬機的啟動是單線程的還是多線程的是多線程的。
前言
之前花了一個星期回顧了Java集合:
Collection總覽
List集合就這么簡單【源碼剖析】
Map集合、散列表、紅黑樹介紹
HashMap就是這么簡單【源碼剖析】
LinkedHashMap就這么簡單【源碼剖析】
TreeMap就這么簡單【源碼剖析】
ConcurrentHashMap基于JDK1.8源碼剖析
Set集合就這么簡單!
Java集合總結(jié)【面試題+腦圖】,將知識點一網(wǎng)打盡!
在寫文章之前通讀了一遍《Java 核心技術(shù) 卷一》的并發(fā)章節(jié)和《Java并發(fā)編程實戰(zhàn)》前面的部分,回顧了一下以前寫過的筆記。從今天開始進入多線程的知識點咯~
之前在學(xué)習(xí)Java基礎(chǔ)的時候?qū)W多線程基礎(chǔ)還是挺認真的,可是在后面一直沒有回顧它,久而久之就把它給忘掉得差不多了..在學(xué)習(xí)JavaWeb上也一直沒用到多線程的地方(我做的東西太水了...)。
由于面試這一部分是占很大比重的,并且學(xué)習(xí)多線程對我以后的提升也是很有幫助的(自以為)。
我其實也是相當(dāng)于從零開始學(xué)多線程的,如果文章有錯的地方還請大家多多包含,不吝在評論區(qū)下指正呢~~
一、初識多線程 1.1介紹進程講到線程,又不得不提進程了~
進程我們估計是很了解的了,在windows下打開任務(wù)管理器,可以發(fā)現(xiàn)我們在操作系統(tǒng)上運行的程序都是進程:
進程的定義:
進程是程序的一次執(zhí)行,進程是一個程序及其數(shù)據(jù)在處理機上順序執(zhí)行時所發(fā)生的活動,進程是具有獨立功能的程序在一個數(shù)據(jù)集合上運行的過程,它是系統(tǒng)進行資源分配和調(diào)度的一個獨立單位
進程是系統(tǒng)進行資源分配和調(diào)度的獨立單位。每一個進程都有它自己的內(nèi)存空間和系統(tǒng)資源
1.2回到線程那系統(tǒng)有了進程這么一個概念了,進程已經(jīng)是可以進行資源分配和調(diào)度了,為什么還要線程呢?
為使程序能并發(fā)執(zhí)行,系統(tǒng)必須進行以下的一系列操作:
(1)創(chuàng)建進程,系統(tǒng)在創(chuàng)建一個進程時,必須為它分配其所必需的、除處理機以外的所有資源,如內(nèi)存空間、I/O設(shè)備,以及建立相應(yīng)的PCB;
(2)撤消進程,系統(tǒng)在撤消進程時,又必須先對其所占有的資源執(zhí)行回收操作,然后再撤消PCB;
(3)進程切換,對進程進行上下文切換時,需要保留當(dāng)前進程的CPU環(huán)境,設(shè)置新選中進程的CPU環(huán)境,因而須花費不少的處理機時間。
可以看到進程實現(xiàn)多處理機環(huán)境下的進程調(diào)度,分派,切換時,都需要花費較大的時間和空間開銷
引入線程主要是為了提高系統(tǒng)的執(zhí)行效率,減少處理機的空轉(zhuǎn)時間和調(diào)度切換的時間,以及便于系統(tǒng)管理。使OS具有更好的并發(fā)性
簡單來說:進程實現(xiàn)多處理非常耗費CPU的資源,而我們引入線程是作為調(diào)度和分派的基本單位(取代進程的部分基本功能【調(diào)度】)。
那么線程在哪呢??舉個例子:
也就是說:在同一個進程內(nèi)又可以執(zhí)行多個任務(wù),而這每一個任務(wù)我就可以看出是一個線程。
所以說:一個進程會有1個或多個線程的!
1.3進程與線程于是我們可以總結(jié)出:
進程作為資源分配的基本單位
線程作為資源調(diào)度的基本單位,是程序的執(zhí)行單元,執(zhí)行路徑(單線程:一條執(zhí)行路徑,多線程:多條執(zhí)行路徑)。是程序使用CPU的最基本單位。
線程有3個基本狀態(tài):
執(zhí)行、就緒、阻塞
線程有5種基本操作:
派生、阻塞、激活、 調(diào)度、 結(jié)束
線程的屬性:
1)輕型實體;
2)獨立調(diào)度和分派的基本單位;
3)可并發(fā)執(zhí)行;
4)共享進程資源。
線程有兩個基本類型:
1) 用戶級線程:管理過程全部由用戶程序完成,操作系統(tǒng)內(nèi)核心只對進程進行管理。
2) 系統(tǒng)級線程(核心級線程):由操作系統(tǒng)內(nèi)核進行管理。操作系統(tǒng)內(nèi)核給應(yīng)用程序提供相應(yīng)的系統(tǒng)調(diào)用和應(yīng)用程序接口API,以使用戶程序可以創(chuàng)建、執(zhí)行以及撤消線程。
值得注意的是:多線程的存在,不是提高程序的執(zhí)行速度。其實是為了提高應(yīng)用程序的使用率,程序的執(zhí)行其實都是在搶CPU的資源,CPU的執(zhí)行權(quán)。多個進程是在搶這個資源,而其中的某一個進程如果執(zhí)行路徑比較多,就會有更高的幾率搶到CPU的執(zhí)行權(quán)
1.4并行與并發(fā)并行:
并行性是指同一時刻內(nèi)發(fā)生兩個或多個事件。
并行是在不同實體上的多個事件
并發(fā):
并發(fā)性是指同一時間間隔內(nèi)發(fā)生兩個或多個事件。
并發(fā)是在同一實體上的多個事件
由此可見:并行是針對進程的,并發(fā)是針對線程的。
1.5Java實現(xiàn)多線程上面說了一大堆基礎(chǔ),理解完的話。我們回到Java中,看看Java是如何實現(xiàn)多線程的~
Java實現(xiàn)多線程是使用Thread這個類的,我們來看看Thread類的頂部注釋:
通過上面的頂部注釋我們就可以發(fā)現(xiàn),創(chuàng)建多線程有兩種方法:
繼承Thread,重寫run方法
實現(xiàn)Runnable接口,重寫run方法
1.5.1繼承Thread,重寫run方法創(chuàng)建一個類,繼承Thread,重寫run方法
public class MyThread extends Thread { @Override public void run() { for (int x = 0; x < 200; x++) { System.out.println(x); } } }
我們調(diào)用一下測試看看:
public class MyThreadDemo { public static void main(String[] args) { // 創(chuàng)建兩個線程對象 MyThread my1 = new MyThread(); MyThread my2 = new MyThread(); my1.start(); my2.start(); } }1.5.2實現(xiàn)Runnable接口,重寫run方法
實現(xiàn)Runnable接口,重寫run方法
public class MyRunnable implements Runnable { @Override public void run() { for (int x = 0; x < 100; x++) { System.out.println(x); } } }
我們調(diào)用一下測試看看:
public class MyRunnableDemo { public static void main(String[] args) { // 創(chuàng)建MyRunnable類的對象 MyRunnable my = new MyRunnable(); Thread t1 = new Thread(my); Thread t2 = new Thread(my); t1.start(); t2.start(); } }
結(jié)果還是跟上面是一樣的,這里我就不貼圖了~~~
1.6Java實現(xiàn)多線程需要注意的細節(jié)不要將run()和start()搞混了~
run()和start()方法區(qū)別:
run():僅僅是封裝被線程執(zhí)行的代碼,直接調(diào)用是普通方法
start():首先啟動了線程,然后再由jvm去調(diào)用該線程的run()方法。
jvm虛擬機的啟動是單線程的還是多線程的?
是多線程的。不僅僅是啟動main線程,還至少會啟動垃圾回收線程的,不然誰幫你回收不用的內(nèi)存~
那么,既然有兩種方式實現(xiàn)多線程,我們使用哪一種???
一般我們使用實現(xiàn)Runnable接口
可以避免java中的單繼承的限制
應(yīng)該將并發(fā)運行任務(wù)和運行機制解耦,因此我們選擇實現(xiàn)Runnable接口這種方式!
二、總結(jié)這篇主要是講解了線程是什么,理解線程的基礎(chǔ)對我們往后的學(xué)習(xí)是有幫助的。這里主要是簡單的入了個門
在閱讀頂部注釋的時候我們發(fā)現(xiàn)有”優(yōu)先級“、”后臺線程“這類的詞,這篇是沒有講解他們是什么東西的~所以下一篇主要講解的是Thread的API~敬請期待哦~
使用線程其實會導(dǎo)致我們數(shù)據(jù)不安全,甚至程序無法運行的情況的,這些問題都會再后面講解到的~
之前在學(xué)習(xí)操作系統(tǒng)的時候根據(jù)《計算機操作系統(tǒng)-湯小丹》這本書也做了一點點筆記,都是比較淺顯的知識點?;蛟S對大家有幫助~
操作系統(tǒng)第一篇【引論】
操作系統(tǒng)第二篇【進程管理】
操作系統(tǒng)第三篇【線程】
操作系統(tǒng)第四篇【處理機調(diào)度】
操作系統(tǒng)第五篇【死鎖】
操作系統(tǒng)第六篇【存儲器管理】
操作系統(tǒng)第七篇【設(shè)備管理】
參考資料:
《Java 核心技術(shù)卷一》
《Java并發(fā)編程實戰(zhàn)》
《計算機操作系統(tǒng)-湯小丹》
如果文章有錯的地方歡迎指正,大家互相交流。習(xí)慣在微信看技術(shù)文章,想要獲取更多的Java資源的同學(xué),可以關(guān)注微信公眾號:Java3y。為了大家方便,剛新建了一下qq群:742919422,大家也可以去交流交流。謝謝支持了!希望能多介紹給其他有需要的朋友
文章的目錄導(dǎo)航:
https://zhongfucheng.bitcron.com/post/shou-ji/wen-zhang-dao-hang
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://www.ezyhdfw.cn/yun/69116.html
摘要:現(xiàn)在已經(jīng)沒有強制線程終止的方法了由于方法可以讓一個線程終止掉另一個線程被終止的線程會立即釋放鎖,這可能會讓對象處于不一致的狀態(tài)。 前言 昨天已經(jīng)寫了: 多線程三分鐘就可以入個門了! 如果沒看的同學(xué)建議先去閱讀一遍哦~ 在寫文章之前通讀了一遍《Java 核心技術(shù) 卷一》的并發(fā)章節(jié)和《Java并發(fā)編程實戰(zhàn)》前面的部分,回顧了一下以前寫過的筆記。從今天開始進入多線程的知識點咯~ 我其實也是相...
摘要:是需要我們?nèi)ヌ幚砗芏嗍虑椋瑸榱朔乐苟嗑€程給我們帶來的安全和性能的問題下面就來簡單總結(jié)一下我們需要哪些知識點來解決多線程遇到的問題。 前言 不小心就鴿了幾天沒有更新了,這個星期回家咯。在學(xué)校的日子要努力一點才行! 只有光頭才能變強 回顧前面: 多線程三分鐘就可以入個門了! Thread源碼剖析 本文章的知識主要參考《Java并發(fā)編程實戰(zhàn)》這本書的前4章,這本書的前4章都是講解并發(fā)的基...
摘要:前言回顧前面多線程三分鐘就可以入個門了源碼剖析多線程基礎(chǔ)必要知識點看了學(xué)習(xí)多線程事半功倍鎖機制了解一下簡簡單單過一遍只有光頭才能變強上一篇已經(jīng)將鎖的基礎(chǔ)簡單地過了一遍了,因此本篇主要是講解鎖主要的兩個子類那么接下來我們就開始吧一鎖首先我們來 前言 回顧前面: 多線程三分鐘就可以入個門了! Thread源碼剖析 多線程基礎(chǔ)必要知識點!看了學(xué)習(xí)多線程事半功倍 Java鎖機制了解一下 AQ...
摘要:所以說我們的線程最好是交由線程池來管理,這樣可以減少對線程生命周期的管理,一定程度上提高性能。線程池不接收新任務(wù),不處理已添加的任務(wù),并且會中斷正在處理的任務(wù)。當(dāng)所有的任務(wù)已終止,記錄的任務(wù)數(shù)量為,線程池會變?yōu)闋顟B(tài)。線程池徹底終止的狀態(tài)。 前言 只有光頭才能變強 回顧前面: ThreadLocal就是這么簡單 多線程三分鐘就可以入個門了! 多線程基礎(chǔ)必要知識點!看了學(xué)習(xí)多線程事半功倍...
摘要:我在面試題中也見過他的身影,但一直不知道是什么東西。直到當(dāng)前線程被或者獲取到資源,結(jié)束。簡簡單單把過一遍明天就看顯式鎖實現(xiàn)咯參考資料如果文章有錯的地方歡迎指正,大家互相交流。為了大家方便,剛新建了一下群,大家也可以去交流交流。 前言 回顧前面: 多線程三分鐘就可以入個門了! Thread源碼剖析 多線程基礎(chǔ)必要知識點!看了學(xué)習(xí)多線程事半功倍 Java鎖機制了解一下 只有光頭才能變強...
閱讀 2889·2023-04-26 02:00
閱讀 2846·2019-08-30 15:54
閱讀 966·2019-08-30 11:15
閱讀 1560·2019-08-29 15:31
閱讀 974·2019-08-29 14:12
閱讀 553·2019-08-29 13:08
閱讀 889·2019-08-27 10:51
閱讀 2766·2019-08-26 12:17