白話說編程之java線程

白話說編程之java線程

  • 線程和進程:
      • 進程:
      • 線程:
      • 線程和進程的區別:
  • 詳解多線程:
      • 并發
        • 為什么使用并發
        • 并發的執行原理
      • 并行
  • 線程的五種狀態:
      • 創建狀態:
      • 就緒狀態:
      • 運行狀態:
      • 阻塞狀態:
      • 死亡狀態:
  • 線程的創建方式:
      • 繼承Thread
      • 實現Runnable
      • 匿名內部類方式
      • 迷惑問題
            • 繼承THread類方法和實現Runnable接口 這兩種方式選擇哪一種好呢?
            • 繼器啟動線程是調用run方法還是start方法
  • 線程的分類:
      • 用戶線程(也叫前臺線程):
      • 守護線程(也叫后臺線程):
    • 分享一波:程序員賺外快-必看的巔峰干貨

線程和進程:

在說多線程之前,我們先來研究一下線程,說到線程,我們又不得不說到進程,因為很多初學者會把線程和進程分不清,搞混淆。

進程:

是操作系統系統運行的最小單元。怎么理解這句話,可以這樣去對比,相信大家都見過積木玩具,可以搭建成很多的大型成品(操作系統Windows/Linux等等),而每一個積木都是組成這個成品的一個組件(也就是進程單元)這是操作系統和進程的關系(操作系統的組成很復雜,不是像積木簡單的組合就能完成的,但是最底層原理我們可以這么想象是沒有問題的)。

線程:

線程是一組指令的集合,它可以獨立的運行在一個進程里。關于指令的集合:就是指我們編程里寫的一個類,里面用到的關鍵字、方法名、變量名等等都是指令(你們可以這樣去理解,完全沒有問題,這里聲明一下真正的指令是jvm編譯成.class文件后,.class中的二進制碼才是真正的指令,但是二進制碼對于人類來說太多太難記,所以就用關鍵字來代表二進制的含義)。在這里我們又可以把線程去當成一個積木,而進程是一個個積木所組成的成品。

線程和進程的區別:

通過上面的例子,不難理解進程和線程之間的關系,進程包含線程,線程是進程的一個單元。所以在這里我們要注意一下,在進程中至少包含一個線程(主線程)。(這樣講,一個積木都沒有還會有成品嗎)

總結:進程是所有線程的集合,每一個線程是進程中的一條執行路徑。
在這里插入圖片描述

詳解多線程:

在上面的例子中,我們知道線程和進程的區別,對于多線程的具體作用我們在這里詳細解釋。

并發

并發:多個線程在一個單核cpu上進行資源搶占并運行,就是并發。
多線程在cpu中是并發運行的(下面會詳細解釋并發,還有和并行的區別)
首先我們要知道在cpu(這里指的是單核cpu)中在某一個時間片,只能有一個線程在cpu中運行。一個cpu在同一時間只能執行一個線程。
在這里插入圖片描述

為什么使用并發

在一個進程中有多個線程需要執行,這些線程會搶占cpu的時間片來運行自身。有人會問,為什么不等一個線程執行完之后再去執行另一個線程呢?思考一下,我們在使用電腦的時候,可以同時看文檔,聽音樂。如果cpu設計成一個線程執行完之后再去執行另一個線程,你就只能聽完音樂,在去看文檔,在聽音樂的過程中你的鼠標都移動不了(鼠標也是一個單獨線程),你們覺得這樣的體驗好嗎,所以cpu肯定不能這樣設計。

并發的執行原理

操作系統是以搶占式的方法來調度線程的(也有其他方法,我們目前先學這一種)。就是線程自己去強cpu的資源,誰先搶到誰就在cpu上運行一個時間片(這個時間片很短很短)。這里的線程會有優先級的特點,優先級高的線程搶到cpu的概率大,概率大,概率大(是概率大,不代表一定能搶到)運行完成之后釋放cpu資源,回去重新搶占cpu。因為運行的時間很短,所以在人為感官上覺得這些線程始再同時運行的。
其實上面多個線程搶占cpu資源就是多線程的并發。

注意:這里是一個cpu。隨著需求的不斷增高,科技的不斷發展,單核cpu的性能已經不能滿足效率。于是就出現了多核cpu,也就出現了并行

并行

并行:在同一時間點,多個線程同時運行在多核cpu的多個核上,這叫并行。和并發不同的是:同一時間,在并行中,線程可以同時運行,而并發則只能有一個線程運行。
在這里插入圖片描述

線程的五種狀態:

創建狀態:

當用new操作符創建一個線程時, 例如new Thread?,線程還沒有開始運行,此時線程處在新建狀態。 當一個線程處于新生狀態時,程序還沒有開始運行線程中的代碼

就緒狀態:

一個新創建的線程并不自動開始運行,要執行線程,必須調用線程的start()方法。當線程對象調用start()方法即啟動了線程,start()方法創建線程運行的系統資源,并調度線程運行run()方法。當start()方法返回后,線程就處于就緒狀態。
處于就緒狀態的線程并不一定立即運行run()方法,線程還必須同其他線程競爭CPU時間,只有獲得CPU時間才可以運行線程。因為在單CPU的計算機系統中,不可能同時運行多個線程,一個時刻僅有一個線程處于運行狀態。因此此時可能有多個線程處于就緒狀態。對多個處于就緒狀態的線程是由Java運行時系統的線程調度程序(thread scheduler)來調度的。

運行狀態:

當線程獲得CPU時間后,它才進入運行狀態,真正開始執行run()方法.

阻塞狀態:

線程運行過程中,可能由于各種原因進入阻塞狀態:
1>線程通過調用sleep方法進入睡眠狀態;
2>線程調用一個在I/O上被阻塞的操作,即該操作在輸入輸出操作完成之前不會返回到它的調用者;
3>線程試圖得到一個鎖,而該鎖正被其他線程持有;
4>線程在等待某個觸發條件;

死亡狀態:

有兩個原因會導致線程死亡:
1> run方法正常退出而自然死亡,
2> 一個未捕獲的異常終止了run方法而使線程猝死。
為了確定線程在當前是否存活著(就是要么是可運行的,要么是被阻塞了),需要使用isAlive方法。如果是可運行或被阻塞,這個方法返回true; 如果線程仍舊是new狀態且不是可運行的, 或者線程死亡了,則返回false.

如圖所示:
在這里插入圖片描述

線程的創建方式:

繼承Thread

在這里插入圖片描述

實現Runnable

在這里插入圖片描述

匿名內部類方式


上面只要會繼承THread類方法和實現Runnable接口這兩種就行,還有其他的線程池創建等等,在后面的章節說

迷惑問題

繼承THread類方法和實現Runnable接口 這兩種方式選擇哪一種好呢?

在java語言中,有一個特點,就是單繼承,多實現。實現了接口還可以繼續繼承,繼承了類不能再繼承。所以一般情況下使用實現Runnable會有更好的拓展性。

繼器啟動線程是調用run方法還是start方法

Run方法僅僅只是線程所要執行的代碼塊部分,如果調用run方法,就和調用其他普通方法一樣,從上到下,順序執行。沒有了多線程的特點。所以使用start方法使線程進入就緒狀態。

線程的分類:

用戶線程(也叫前臺線程):

用戶自定義創建的線程,用戶線程的狀態不受其他線程的影響。別的線程掛了就掛了,影響不到他,因為他們是互相獨立的。

守護線程(也叫后臺線程):

守護線程受用戶線程的影響,當用戶線程銷毀后,守護線程也會跟著銷毀。比如GC

分享一波:程序員賺外快-必看的巔峰干貨

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

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

相關文章

powerdesigner顯示工具面板_photoshop教程-畫筆工具預設與選項設置

定義畫筆預設在打開的“畫筆”面板中,單擊左側的“畫筆筆尖形狀”名稱,可顯示筆尖形狀圖案。單擊“畫筆”面板左側其他不同的選項名稱,在右側就會顯示其對應的調節項。只單擊不同選項前面的方框,可使此選項有效,但右側…

C#屬性的聲明和使用演示源碼片段

工作閑暇時間,將代碼過程重要的一些代碼做個收藏,如下代碼是關于C#屬性的聲明和使用演示片段的代碼,應該對碼農有一些好處。 using System; class Person {private string myName "N/A";private int myAge 0;public string Name{g…

深入理解== 和 equals 的區別

深入理解 和 equals 的本質區別簡介區別:圖解:注意點:源碼分析:總結分享一波:程序員賺外快-必看的巔峰干貨簡介 初學者常常被" “和‘equals ’所折磨,為什么,因為他們的大概意思相同,都是…

rsem比對_RSEM方法比對和表達量計算

分析模塊,封裝了Trinity程序包中的“align_and_estimate_abundance.pl”腳本,進行原始數據與轉錄本序列的比對和表達量計算。其中,核心程序為,Bowtie或Bowtie2進行原始數據與轉錄本序列的比對,RSEM根據比對結果進行表達…

java sleep和wait區別

為什么80%的碼農都做不了架構師?>>> 關于sleep和wait區別解析: sleep只是釋放CPU資源,并不釋放資源鎖對象,wait是會釋放掉資源鎖對象。 比如,有個鎖對象object,線程1和線程2都會鎖住object對象…

u8轉完看不到菜單_web網頁有錯誤,無法看到操作菜單-用友U8

文章摘要:本文提供在用友U8V8.51erp軟件財務會計管理的WEB財務模塊中客戶在使用WEB功能時,沒有使用默認的設置,是將WEB功能設置在自己的網站上面,訪問WEB功能沒有問題,界面出來了,輸入用戶名、密碼、選擇帳…

.Net Core 項目引用本地類庫方式(二)

上篇文章有詳細的介紹.Net Core 項目中引用本地類庫通過打包,然后Nugety引用方式,這里再介紹一種引用包的方式 轉載于:https://www.cnblogs.com/wangshitou/p/10283800.html

深入理解equals和hashCode關系和區別

深入理解equals和hashCode關系和區別直入主題:區別:1.他們判斷對象相同的方式不一樣:2.他們判斷對象是否相等的準確率不一樣:改寫equals時總是要改寫hashcode分享一波:程序員賺外快-必看的巔峰干貨為什么要說equals和hashCode這兩…

lol韓服游戲內設置_韓服LOL進去了還不能玩?教你如何玩韓服!

領取免費韓服LOL安全號,百度搜索韓服LOL微博關注即可!上圖錯誤為常識性錯誤,LOL韓服游戲的安裝文件路徑有中文所導致的錯誤 解決方法:將安裝路徑里的中文改成英文即可 舉例 包含中文漢字的文件夾都是錯誤的 Program FilesLOL韓服 …

Jdk 和 jre 的 關系和區別

Jdk 和 jre 的 關系和區別 區別: JDK:是Java Development Kit 的簡稱–>翻譯過來就是:Java 開發工具包。是程序員使用java語言編寫java程序所需的開發工具包,是提供給程序員使用的。 JRE:是Java Runtime Environm…

OpenCV-Python入門教程7-PyQt編寫GUI界面

前面一直都是使用命令行運行代碼,不夠人性化。這篇用Python編寫一個GUI界面,使用PyQt5編寫圖像處理程序。包括:打開、關閉攝像頭,捕獲圖片,讀取本地圖片,灰度化和Otsu自動閾值分割的功能。 使用Qt Designer…

spark 廣播變量大數據_大數據處理 | Spark集群搭建及基本使用

點擊藍字關注我前面用了一篇文章詳細的介紹了集群HDFS文件系統的搭建,HDFS文件系統只是一個用于存儲數據的系統,它主要是用來服務于大數據計算框架,例如MapReduce、Spark,本文就接著上一篇文章來詳細介紹一下Spark集群的搭建及Spa…

如何將本地項目上傳到gitee

*************************************優雅的分割線 ********************************** 分享一波:程序員賺外快-必看的巔峰干貨 如果以上內容對你覺得有用,并想獲取更多的賺錢方式和免費的技術教程 請關注微信公眾號:HB荷包 一個能讓你學習技術和賺錢方法的公眾號,持續更…

oracle dg 備庫未設置convert參數導致ORA-01111,ORA-01110

2019獨角獸企業重金招聘Python工程師標準>>> 查看trace 文件: MRP0: Background Managed Standby Recovery process started (amls) started logmerger process Sun Jan 20 07:55:53 2019 Managed Standby Recovery starting Real Time Apply MRP0: Back…

git回退歷史版本無法上傳_Git系列教程(二):版本庫中添加文件、版本回退

Git系列教程(一):簡介、安裝、配置我們學習了分布式和版本控制系統的概念、Git具有的8個功能以及如何在Windows上安裝Git、進行相關配置并創建版本庫。Git版本庫中添加文件Git 的工作就是創建和保存你的項目的快照及與之后的快照進行對比。我們編寫一個readme.txt文…

nginx反向代理配置如何去除前綴

使用nginx做反向代理的時候,可以簡單的直接把請求原封不動的轉發給下一個服務。設置proxy_pass請求只會替換域名,如果要根據不同的url后綴來訪問不同的服務,則需要通過如下方法: 方法一:加"/"** server {l…

「作文素材詳解」寫作必知篇:語言優美不是作文第一要求

語言優美不是作文第一要求“教孩子寫作文,老師家長應該先提升自己。”“語言優美不是作文的第一要求。”“如果教孩子寫漂亮的違心話,會害了他一輩子。”日前,著名作家肖復興來到體育東路小學,與廣州的一線語文教師交流&#xff0…

華為安裝gsm框架_華為nova5怎么下載安裝谷歌服務助手,安裝GMS框架教程

看到不少的華為nova5用戶喜歡這個谷歌服務助手,也就是想安裝這個GMS框架,可是一直不知道如何下載安裝,這個谷歌服務框架是可以在系統軟件里面可以刪除的一個APK程序,但現在有很多的軟件和游戲需要谷歌服務的支持,那咱們…

VMware安裝虛擬機并使用NAT模式連接網絡

*************************************優雅的分割線 ********************************** 分享一波:程序員賺外快-必看的巔峰干貨 如果以上內容對你覺得有用,并想獲取更多的賺錢方式和免費的技術教程 請關注微信公眾號:HB荷包 一個能讓你學習技術和賺錢方法的公眾號,持續更…