Java SE入門及基礎(59) 線程的實現(上) 線程的創建方式 線程內存模型 線程安全

目錄

線程(上)

1. 線程的創建方式

Thread類常用構造方法

Thread類常用成員方法

Thread類常用靜態方法

示例

總結

2. 線程內存模型

3.線程安全

案例

代碼實現

執行結果


線程(上)

1. 線程的創建方式

????????An application that creates an instance of Thread must provide the code that will run in that thread. There are two ways to do this:
????????創建Thread 實例的應用程序必須提供將在該線程中運行的代碼。 有兩種方法可以做到這一點:
????????-Provide a Runnable object. The Runnable interface defines a single method, run, meant to contain the code executed in the thread.
????????-提供可運行的對象。 Runnable 接口定義了一個方法 run ,旨在包含在線程中執行的代碼。
????????-Subclass Thread. The Thread class itself implements Runnable, though its run method does nothing.
????????-子類線程。 Thread 類本身實現了 Runnable ,盡管它的 run 方法不執行任何操作。
Thread類常用構造方法
public Thread (); // 創建一個線程
public Thread ( String name ); // 創建一個依據名稱的線程
public Thread ( Runnable target ); // 根據給定的線程任務創建一個線程
public Thread ( Runnable target , String name ); // 根據給定的線程任務和名稱創建一個線程
Thread類常用成員方法
public synchronized void start (); // 啟動線程但不一定會執行
public final String getName (); // 獲取線程名稱
public final synchronized void setName ( String name ); // 設置線程的名稱
public final void setPriority ( int newPriority ); // 設置線程的優先級
public final int getPriority (); // 獲取線程的優先級
public final void join () throws InterruptedException ; // 等待線程執行完成
// 等待線程執行給定的時間 ( 單位毫秒 )
public final synchronized void join ( long millis ) throws
InterruptedException ;
// 等待線程執行給定的時間 ( 單位毫秒、納秒 )
public final synchronized void join ( long millis , int nanos ) throws
InterruptedException ;
public long getId (); // 獲取線程的 ID
public State getState (); // 獲取線程的狀態
public boolean isInterrupted (); // 檢測線程是否被打斷
public void interrupt (); // 打斷線程
Thread類常用靜態方法
public static native Thread currentThread (); // 獲取當前運行的線程
public static boolean interrupted (); // 檢測當前運行的線程是否被打斷
public static native void yield (); // 暫停當前運行的線程,然后再與其他線程爭搶資源,稱
為線程禮讓
// 使當前線程睡眠給定的時間(單位毫秒)
public static native void sleep ( long millis ) throws InterruptedException ;
// 使當前線程睡眠給定的時間(單位毫秒、納秒)
public static void sleep ( long millis , int nanos ) throws
InterruptedException ;
示例
public class CreateDemo {
????????public static void main ( String [] args ) {
????????????????Thread t1 = new SubThread ( "inherit" ); // 通過繼承實現的線程
????????????????Thread t2 = new Thread ( new ThreadTask (), "interface" ); // 通過實現
????????????????Runnable接口實現的線程
????????????????t1 . start (); //start 方法只是告訴 JVM 線程 t1 已經準備好了,隨時可以調度執行
????????????????try {
????????????????????????t1 . join (); // 等待線程 t1 執行完成
????????????????????????t1 . join ( 1000 ); // 等待線程 t1 執行 1
????????????????????????// 1毫秒 = 1000微秒 = 1000000 納秒
????????????????????????t1 . join ( 1000 , 50000 ); // 等待線程 t1 執行 1.5
????????????????} catch ( InterruptedException e ) {
????????????????????????e . printStackTrace ();
????????????????}
????????????????t2 . start ();
????????}
????????static class SubThread extends Thread {
????????????????public SubThread () {
????????????????}
????????????????public SubThread ( String name ) {
????????????????????????super ( name );
????????????????}
????????????????@Override
????????????????public void run () {
????????????????????????try {
????????????????????????????????Thread . sleep ( 2000 );
????????????????????????} catch ( InterruptedException e ) {
????????????????????????????????e . printStackTrace ();
????????????????????????}
????????????????????????System . out . println ( getName () + "=>This is SubThread" );
????????????????}
????????}
????????static class ThreadTask implements Runnable {
????????????????@Override
????????????????public void run () {
????????????????????????Thread thread = Thread . currentThread ();
???????????????????????String name = thread . getName ();
????????????????????????System . out . println ( name + "=>This is Implementation" );
????????????????}
????????}
}
總結
????????創建線程有兩種方式:實現 Runable 接口和繼承 Thread 。相較于繼承 Thread ,實現 Runable 接口更具有優勢,在實現接口的同時還可以繼承自其他的父類,避免了Java 中類單繼承的局限性;同時Runable 接口的實現可以被多個線程重用,但繼承 Thread 無法做到;后續學到的線程池中支持Runable 接口但不支持 Thread

2. 線程內存模型

3.線程安全

案例
某火車站有 10 張火車票在 3 個窗口售賣
代碼實現
public class SaleThreadTest {
????????public static void main ( String [] args ) {
????????????????SaleTask task = new SaleTask ();
????????????????Thread t1 = new Thread ( task , " 窗口 1" );
????????????????Thread t2 = new Thread ( task , " 窗口 2" );
????????????????Thread t3 = new Thread ( task , " 窗口 3" );
????????????????t1 . start ();
????????????????t2 . start ();
????????????????t3 . start ();
????????}
static class SaleTask implements Runnable {
????????private int totalTickets = 10 ; // 售賣 10 張火車票
????????@Override
????????public void run () {
????????????????while ( true ){
????????????????????????String name = Thread . currentThread (). getName ();
????????????????????????System . out . println ( name + " 售賣火車票: " + totalTickets );
????????????????????????totalTickets -- ;
????????????????????????if ( totalTickets <= 0 ) break ;
????????????????????????????????try {
????????????????????????????????????????Thread . sleep ( 100L );
????????????????????????????????} catch ( InterruptedException e ) {
????????????????????????????????????????e . printStackTrace ();
????????????????????????????????}
????????????????????????}
????????????????}
????????}
}
執行結果

從結果中可以看出,同一張火車票被賣了多次,這是由于線程之間獲取信息不同步導致。

更多參考:

Java SE入門及基礎(60)& 線程的實現(下) & 線程的同步(synchronized 和 Lock 的實現) & 線程通信 & 線程狀態-CSDN博客

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

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

相關文章

利用 Docker 簡化 Nacos 部署:快速搭建 Nacos 服務

利用 Docker 簡化 Nacos 部署&#xff1a;快速搭建 Nacos 服務 引言 在微服務架構中&#xff0c;服務注冊與發現是確保服務間通信順暢的關鍵組件。Nacos&#xff08;Dynamic Naming and Configuration Service&#xff09;作為阿里巴巴開源的一個服務發現和配置管理平臺&…

任務調度器——任務切換

一、開啟任務調度器 函數原型&#xff1a; void vTaskStartScheduler( void ) 作用&#xff1a;用于啟動任務調度器&#xff0c;任務調度器啟動后&#xff0c; FreeRTOS 便會開始進行任務調度 內部實現機制&#xff08;以動態創建為例&#xff09;&#xff1a; &#xff0…

Linux 安裝、配置Tomcat 的HTTPS

Linux 安裝 、配置Tomcat的HTTPS 安裝Tomcat 這里選擇的是 tomcat 10.X ,需要Java 11及更高版本 下載頁 ->Binary Distributions ->Core->選擇 tar.gz包 下載、上傳到內網服務器 /opt 目錄tar -xzf 解壓將解壓的根目錄改名為 tomat-10 并移動到 /opt 下, 形成個人…

測評推薦:企業管理u盤的軟件有哪些?

U盤作為一種便攜的存儲設備&#xff0c;方便易用&#xff0c;被廣泛應用于企業辦公、個人學習及日常工作中。然而&#xff0c;U盤的使用也帶來了數據泄露、病毒傳播等安全隱患。為了解決這些問題&#xff0c;企業管理U盤的軟件應運而生。 本文將對市面上流行的幾款U盤管理軟件…

Hadoop3:Yarn容量調度器配置多隊列案例

一、情景描述 需求1&#xff1a; default隊列占總內存的40%&#xff0c;最大資源容量占總資源60%&#xff0c;hive隊列占總內存的60%&#xff0c;最大資源容量占總資源80%。 二、多隊列優點 &#xff08;1&#xff09;因為擔心員工不小心&#xff0c;寫遞歸死循環代碼&#…

數據處理:四選一、四關聯

今天去面試&#xff0c;面試官們給我一個‘選擇’&#xff0c;有四個選項&#xff1a;‘展示你的才華’、‘展示你的美貌’、‘展示你的才華與美貌’、‘都不展示’ {label: “選擇”,children: [{label: “展示你的才華”,children: [],isShow: talentModal,click: () > {i…

電路筆記(電源模塊): 基于FT2232HL實現的jtag下載器硬件+jtag的通信引腳說明

JTAG接口說明 JTAG 接口根據需求可以選擇20針或14針的配置&#xff0c;具體選擇取決于應用場景和需要連接的功能。比如之前的可編程邏輯器件XC9572XL使用JTAG引腳&#xff08;TCK、TDI、TDO、TMS、VREF、GND&#xff09;用于與器件進行調試和編程通信。更詳細的內容可以閱讀11…

51單片機STC8H8K64U通過RA8889/RA8876如何控制彩屏(SPI源碼下載)

【硬件部份】 一、硬件連接實物&#xff1a; STC8H系列單片機不需要外部晶振和外部復位&#xff0c;在相同的工作頻率下&#xff0c;速度比傳統的8051單片機要快12倍&#xff0c;具有高可靠抗干擾的優秀特性&#xff0c;與瑞佑的RA8889/RA8876控制芯片剛好可以完美搭配用于工…

redis實戰-緩存雪崩問題及解決方案

定義理解 緩存雪崩是指在同一時間段&#xff0c;大量緩存的key同時失效&#xff0c;或者Redis服務宕機&#xff0c;導致大量請求到達數據庫&#xff0c;帶來巨大壓力 和緩存擊穿的區別&#xff1a; 緩存雪崩是由于緩存中的大量數據同時失效或緩存服務器故障引起的&#xff1b…

(漏洞檢查項) | 服務端請求偽造 SSRF

(漏洞檢查項)|服務端請求偽造 SSRF 漏洞場景 服務端請求偽造&#xff08;SSRF&#xff0c;Server-Side Request Forgery&#xff09;漏洞發生在應用程序允許攻擊者通過構造惡意請求&#xff0c;利用服務器端發起HTTP請求&#xff0c;并訪問內部資源或進行其他未授權操作。 漏…

css_20_定位

相對定位 設置相對定位 給元素設置 position: relative 即可實現相對定位。 可以使用 left、right、top 、 bottom 四個屬性調整位置。 相對定位的參考點是相對自己原來的位置相對定位的特點&#xff1a; 1&#xff0e;不會脫離文檔流&#xff0c;元素位置的變化&#xff0c;只…

機器學習周記(第四十五周:Graphformer)2024.6.24~2024.6.30

目錄 摘要ABSTRACT1 論文信息1.1 論文標題1.2 論文摘要1.3 論文引言1.4 論文貢獻 2 論文模型2.1 問題定義2.2 模型架構2.2.1 自注意下采樣模塊&#xff08;Self-attention down-sampling module&#xff09;2.2.2 稀疏圖自注意力機制&#xff08;Sparse graph self-attention m…

python自動移除excel文件密碼(小工具)

安裝 msoffcrypto-tool 使用pip命令安裝: 打開命令行工具&#xff08;如終端、命令提示符或Powershell&#xff09;&#xff0c;然后輸入以下命令來安裝msoffcrypto-tool&#xff1a; pip install msoffcrypto-tool庫&#xff0c;進行自動移除excel文件密碼 import msoffcrypt…

【C++】using namespace std 到底什么意思

&#x1f4e2;博客主頁&#xff1a;https://blog.csdn.net/2301_779549673 &#x1f4e2;歡迎點贊 &#x1f44d; 收藏 ?留言 &#x1f4dd; 如有錯誤敬請指正&#xff01; &#x1f4e2;本文作為 JohnKi 的學習筆記&#xff0c;引用了部分大佬的案例 &#x1f4e2;未來很長&a…

新手練習項目 7:猜數字游戲

名人說&#xff1a;莫聽穿林打葉聲&#xff0c;何妨吟嘯且徐行。—— 蘇軾《定風波莫聽穿林打葉聲》 Code_流蘇(CSDN)&#xff08;一個喜歡古詩詞和編程的Coder&#xff09; 目錄 一、項目描述二、項目實現三、項目步驟四、項目擴展方向 更多項目內容&#xff0c;請關注我、訂…

comsol學習筆記

comsol巖土力學與流固耦合的學習 comsol的相關視頻教程 https://www.bilibili.com/video/BV1Cu4y1r7Gn/?spm_id_from333.337.search-card.all.click&vd_source02b2bad477a153eaeb9c48cbbedaf8df [這里面有講解地應力平衡技術] https://www.bilibili.com/video/BV17C4y1j…

打靶記錄——靶機medium_socnet

靶機下載地址 https://www.vulnhub.com/entry/boredhackerblog-social-network,454/ 打靶過程 由于靶機和我的Kali都處于同一個網段&#xff0c;所以使用arpscan二次發現技術來識別目標主機的IP地址 arpscan -l除了192.168.174.133&#xff0c;其他IP都是我VMware虛擬機正…

【Spring Boot】認識 JPA 的接口

認識 JPA 的接口 1.JPA 接口 JpaRepository2.分頁排序接口 PagingAndSortingRepository3.數據操作接口 CrudRepository4.分頁接口 Pageable 和 Page5.排序類 Sort JPA 提供了操作數據庫的接口。在開發過程中繼承和使用這些接口&#xff0c;可簡化現有的持久化開發工作。可以使 …

springboot學習,如何用redission實現分布式鎖

目錄 一、springboot框架介紹二、redission是什么三、什么是分布式鎖四、如何用redission實現分布式鎖 一、springboot框架介紹 Spring Boot是一個開源的Java框架&#xff0c;由Pivotal團隊&#xff08;現為VMware的一部分&#xff09;于2013年推出。它旨在簡化Spring應用程序…

大數據面試題之Spark(1)

目錄 Spark的任務執行流程 Spark的運行流程 Spark的作業運行流程是怎么樣的? Spark的特點 Spark源碼中的任務調度 Spark作業調度 Spark的架構 Spark的使用場景 Spark on standalone模型、YARN架構模型(畫架構圖) Spark的yarn-cluster涉及的參數有哪些? Spark提交jo…