Java這些多線程基礎知識你會嗎?

0、并發和并行、進程核線程、多進程和多線程的區別:

(這里的時間和時刻上的概念同物理上的一樣)

并發:在一段時間內多個任務同時執行,或者說是在一段很短的時間內可以執行多條程序指令,微觀上看起來好像是可以同時運行多個進程,單核處理器就可以做到。

并行:在同一時刻多個任務同時執行,或者說是在同一時刻可以執行多條程序指令,多核處理器才可以做到。

進程:進程是程序的一次執行過程,是系統運行程序的基本單位,打開 Windows 的任務管理器就可以看到很多進程。

線程:線程與進程相似,但線程是一個比進程更小的執行單位,一個進程在其執行的過程中可能產生多個線程。

多進程:每個進程都擁有自己獨立的資源,多個進程可在單核處理器上并發執行,在多核處理器上并行執行。

多線程:一個進程可由多個線程組成,多個線程共享進程內資源,多個線程可在單核處理器上并發執行,在多核處理器并行執行。

在多核處理器上,并發和并行同時存在,處理器上的每個核同一時刻同時執行多個任務,每個核在很短的時間段內又同時執行多個任務,對多任務粗略劃分是多個進程,對進程劃分可能又是多個線程。同一時刻,處理器的每個核只能運行一個進程中的一個線程中的一條指令(Intel 的超線程技術,如雙核四線程,四核八線程,處理器的線程(硬件上)和進程中的線程(軟件上)不是一個概念,這個所謂的超線程技術也并不能達到真正的多核,只是盡可能的提高處理器的吞吐量核利用率)。

線程比進程更加的輕量級,進程和線程都是提高程序并發性和系統性能的手段,但并不是說進程越多或線程越多,性能越高,還要結合硬件設備和操作系統來看。

1、創建線程的三種方式:

繼承 Thread 類,覆寫父類中的 run() 方法,新線程類創建線程

實現 Runnable 接口,實現接口中的 run() 方法,Thread 類創建線程

實現 Callable 接口,FutureTask 類構造創建方法體,Thread 類創建線程

(掃一掃即可查看測試代碼)

2、三種方式的優劣:

3、線程的六種狀態:

Thread.State 枚舉類中的定義

NEW:還沒開始運行的線程處于這種狀態

RUNNABLE:在 Java 虛擬機中可運行的線程(正在運行也可能沒在運行)處于這種狀態

BLOCKED:被阻塞而等待監視鎖的線程處于這種狀態

WAITING:無限期的等待另一個線程執行特定方法的線程處于這種狀態

TIMED_WAITING:在指定等待時間內等待另一個線程執行特定的方法的線程處于這種狀態

TERMINATED:已經退出(運行結束)的線程處于這種狀態

4、線程的生命周期:

5、線程的分類:

1、普通線程:前臺線程

2、守護線程:

后臺線程,運行在后臺為其他線程提供服務,如果所有的前臺線程都死亡,后臺線程也自動死亡。當整個虛擬機中只剩下后臺線程,虛擬機也沒有繼續運行的必要了,虛擬機也就退出了。

應用:JVM 虛擬機啟動后的后臺檢測線程,數據庫連接池中的檢測線程。

最常見的守護線程:虛擬機中的垃圾回收線程,可以通過 jconsole,jvisualvm 等工具查看。

6、線程中的常用方法說明:

start():

在使用 new 關鍵字創建一個線程后(New 狀態),并不表現出任何的線程活動狀態(非 New、Terminated 狀態,可以使用 isAlive 方法檢測線程的活動狀態),CPU 也不會執行線程中的代碼。

只有在 start() 方法執行后,才表示這個線程可運行了(Runnable 狀態),至于何時真正運行還要看線程調度器的調度。

在線程死亡后,不要再次調用 start() 方法。只能對新建狀態的線程調用且只能調用一次 start() 方法,否則將拋出 IllegalThreadStateException 異常。

run():

啟動線程是 start() 方法,而不是 run() 方法。

如果直接調用 run() 方法,這個線程中的代碼會被立即執行,多個線程就無法并發執行了。

join():

等待該線程完成的方法,其他線程將進入等待狀態(Waiting 狀態),通常由使用線程的程序(線程)調用,如將一個大問題分割為許多小問題,要等待所有的小問題處理后,再進行下一步操作。

sleep():

主動放棄占用的處理器資源,該線程進入阻塞狀態(Blocked 狀態),指定的睡眠時間超時后,線程進入就緒狀態(Runnable),等待線程調度器的調用。

yield():

主動放棄占用的處理器資源,線程直接進入就緒狀態(Runnable),等待線程調度器的調用。

可能的情況是當線程使用 yield 方法放棄執行后,線程調度器又將該線程調度執行。

interrupt():

沒有任何強制線程終止的方法,這個方法只是請求線程終止,而實際上線程并不一定會終止,在調用 sleep() 方法時可能會出現 InterruptedException 異常,你可能會想在異常捕獲后(try-catch語句中的catch)請求線程終止,而更好的選擇是不處理這個異常,拋給調用者處理,所以這個方法并沒有實際的用途,還有 isInterrupted() 方法檢查線程是否被中斷。

setDaemon():

設置守護進程,該方法必須在 start() 方法之前調用,判斷一個線程是不是守護線程,可以使用 isDaemon() 方法判斷。

setPriority():

設置線程的優先級,理論上來說,線程優先級高的線程更容易被執行,但也要結合具體的系統。

每個線程默認的優先級和父線程(如 main 線程、普通優先級)的優先級相同,線程優先級區間為 1~10,三個靜態變量:MIN_PRIORITY = 1、NORM_PRIORITY = 5、MAX_PRIORITY = 10。

使用 getPriority() 方法可以查看線程的優先級。

isAlive():

檢查線程是否處于活動狀態,如果線程處于就緒、運行、阻塞狀態,方法返回 true,如果線程處于新建和死亡狀態,方法返回 false。

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

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

相關文章

MySQL set names 命令_mysql set names 命令和 mysql 字符編碼問題

先看下面的執行結果:(rootlocalhost)[(none)]mysql>show variables like character%;---------------------------------------------------------------------------------------| Variable_name | Value |---------------------------------------------------…

設置Proxy Server和SQL Server實現數據庫安全

首先,我們需要了解一下SQL Server在WinSock上定義協議的步驟: 1. 在”啟動”菜單上,指向”程序/Microsoft Proxy Server”,然后點擊”Microsoft Management Console”。 2. 展開”Internet Information Service”,再展開運行Proxy…

Python django解決跨域請求的問題

解決方案 1.安裝django-cors-headers pip3 install django-cors-headers 2.配置settings.py文件 INSTALLED_APPS [...corsheaders,...] MIDDLEWARE_CLASSES (...corsheaders.middleware.CorsMiddleware,django.middleware.common.CommonMiddleware, # 注意順序...…

加勒比海兔_加勒比海海洋物種趨勢

加勒比海兔Ok, here’s a million dollar question: is the Caribbean really dying? Or, more specifically, are marine species found on Caribbean reefs becoming less abundant?好吧,這是一個百萬美元的問題:加勒比海真的死了嗎? 或者…

mysql 查出相差年數_MySQL計算兩個日期相差的天數、月數、年數

MySQL自帶的日期函數TIMESTAMPDIFF計算兩個日期相差的秒數、分鐘數、小時數、天數、周數、季度數、月數、年數,當前日期增加或者減少一天、一周等等。SELECT TIMESTAMPDIFF(類型,開始時間,結束時間)相差的秒數:SELECT TIMESTAMPDIFF(SECOND,1993-03-23 0…

tornado 簡易教程

引言 回想Django的部署方式 以Django為代表的python web應用部署時采用wsgi協議與服務器對接(被服務器托管),而這類服務器通常都是基于多線程的,也就是說每一個網絡請求服務器都會有一個對應的線程來用web應用(如Djang…

如果你的電腦是通過代理上網的.就要用端口映射

由于公網IP地址有限,不少ISP都采用多個內網用戶通過代理和網關路由共用一個公網IP上INTERNET的方法, 這樣就限制了這些用戶在自己計算機上架設個人網站,要實現在這些用戶端架設網站,最關鍵的一點是, 怎樣把多用戶的內網…

人口密度可視化_使用GeoPandas可視化菲律賓的人口密度

人口密度可視化GeoVisualization /菲律賓。 (GeoVisualization /Philippines.) Population density is a crucial concept in urban planning. Theories on how it affects economic growth are divided. Some claim, as Rappaport does, that an economy is a form of “spati…

Unity - Humanoid設置Bip骨骼導入報錯

報錯如下: 解決: 原因是biped骨骼必須按照Unity humanoid的要求設置,在max中設置如下: 轉載于:https://www.cnblogs.com/CloudLiu/p/10746052.html

python3openpyxl無法打開文件_Python3 處理excel文件(openpyxl庫)

openpyxl 介紹openpyxl是一個用于讀/寫 XLSX/XLSM/XLTX/XLTM文件的python庫。openpyxl(可讀寫excel表)專門處理Excel2007及以上版本產生的xlsx文件;2007一下的版本為xls后綴的文件,需要使用 xlrd和xlwt庫進行操作。雖然xlrd和xlwt也可以進行文件讀寫&…

Kubernetes - - k8s - v1.12.3 OpenLDAP統一認證

1,基本概念 為了方便管理和集成jenkins,k8s、harbor、jenkins均使用openLDAP統一認證。2,部署openLDAP 根據之前的文檔,openLDAP使用GFS進行數據持久化。下載對應的openLDAP文件git clone https://github.com/xiaoqshuo/k8s-clust…

給程序加殼

在內存中運行可執行程序,好處是可以給程序加殼,加密源程序,靜態反匯編無法獲得PE輸入節,但是因為運行后仍然是獨立的進程,所以沒辦法防止遠程線程注入,掛接API鉤子。 typedef IMAGE_SECTION_HEADER ( * PIM…

srpg 勝利條件設定_英雄聯盟獲勝條件

srpg 勝利條件設定介紹 (Introduction) The e-sports community has been growing rapidly in the past few years, and what used to be a casual pastime has morphed into an industry projected to generate $1.8 B in revenue by 2022. While there are many video games …

[Egret][文檔]遮罩

——遮罩的作用是指定一個顯示對象的可見區域,即這個顯示對象只在這個區域可見。 一、矩形遮罩 將一個矩形對象賦值給顯示對象的 mask 屬性。 shp.mask new egret.Rectangle(20,20,30,50); 【注】:這個矩形的坐標(20,20)和(30,50)是相對于被遮罩對象shp…

clob類型字段最大存儲長度_請教oracle的CLOB字段的最大長度?

CLOB和BLOB都是4G,而LONG ,LONG raw是舊時代的oracle二進制和長文本表示,將來會被廢棄。最長長度是2G.單位是Byte表中單個 LOB 字段 在 9i 版本中可保存 4GB 數據, 在 10g 版本中可保存多達 128TB 的數據.所以理論上是沒限制的ORACLE的數據類型-- ORAC…

JdbcUtil

轉自:https://github.com/ghyg525/util_java_jdbc JdbcUtil.java import java.io.IOException; import java.sql.Connection; import java.sql.DriverManager; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.ResultSetMetaData; …

機器學習 綜合評價_PyCaret:機器學習綜合

機器學習 綜合評價Any Machine Learning project journey starts with loading the dataset and ends (continues ?!) with the finalization of the optimum model or ensemble of models for predictions on unseen data and production deployment.任何機器學習項目的旅程都…

silverlight 3D 游戲開發

http://www.postvision.net/SilverMotion/DemoTech.aspx silverlight 3D 游戲開發 時間:2010-10-22 06:33來源:開心銀光 作者:黎東海 點擊: 562次意外發現一個silverlight的實時3D渲染引擎。性能比開源那些強很多。 而且支持直接加載maya,3Dmax等主流3D模型文件。 附件附上它的…

redis終端簡單命令

keys * 獲取所有鍵lRange hongbao:44 0 -1獲取該鍵的所有值del hongbao:44 刪除該鍵的所有值 hgetAll user:44 獲取該鍵的所有隊列hget hongbao:44 8 獲取該隊列用戶為8的值hset hongbao:44 7 asdf設置該隊列用戶為7的值hdel user:44 8 刪除該隊列用戶為8的值 flushall 清空red…

python中ix用法_Python中使用ix的數據幀子集

您可以使用X[var2].iloc[[0,1]]:In [280]: X[var2].iloc[[0,1]]Out[280]:0 NaN4 9Name: var2, dtype: float64由于X[var2]是X的視圖,因此X[var2].iloc[[0,1]]對兩者都是安全的訪問和分配。但是如果你使用這種“鏈式索引”要小心模式(例如這里使用的index…