自定義線程

每個程序至少有一個線程 —— 主線程

主線程是程序的起點,你可以從它開始創建新的線程來執行任務。為此,你需要創建自定義線程,編寫在線程中執行的代碼,并啟動它。

通過繼承創建自定義線程

創建新線程有兩種主要方式:

  1. 繼承 Thread 類并重寫其 run 方法

  2. 實現 Runnable 接口,并將實現類傳遞給 Thread 類的構造函數

下面是繼承 Thread 類并重寫 run 方法的示例:

class HelloThread : Thread() {override fun run() {val helloMsg = "Hello, i'm $name"println(helloMsg)}
}

而下面是實現 Runnable 接口并傳遞給 Thread 構造函數的示例:

class HelloRunnable : Runnable {override fun run() {val threadName = Thread.currentThread().nameval helloMsg = "Hello, i'm $threadName"println(helloMsg)}
}

這兩種方式都需要你重寫 run 方法,它是一個普通的方法,包含了你要執行的代碼。選擇哪種方式取決于具體任務和個人偏好。

如果你繼承了 Thread 類,可以直接使用其字段和方法,但 Kotlin 不支持多重繼承,所以你不能再繼承其他類。

創建線程對象

Thread 類有很多構造函數,我們來看其中幾個示例:

val t1 = HelloThread()              // 使用子類
val t2 = Thread(HelloRunnable())    // 傳入 Runnable 實現
val myThread = Thread(HelloRunnable(), "my-thread") // 指定線程名

如果你想在 HelloThread 類中設置線程名,需要重寫構造函數。

因此,實現 Runnable 接口是一種更靈活的方式。

使用 Lambda 更簡單

如果你已經熟悉 Lambda 表達式,可以用下面這種方式:

val t3 = Thread {println("Hello, i'm ${Thread.currentThread().name}")
}

更簡便的線程創建方式

如果不想繼承或實現接口,也可以使用 thread(...) 函數創建線程,它來自 kotlin.concurrent 包:

import kotlin.concurrent.threadval t4 = thread(start = false, name = "Thread 4", block = {println("Hello, I'm ${Thread.currentThread().name}")
})

該函數的參數包括:

  • start:是否立即啟動線程;

  • isDaemon:是否為守護線程;

  • contextClassLoader:類加載器;

  • name:線程名稱;

  • priority:優先級;

  • block:線程執行代碼塊。

啟動線程

使用 Thread 類的 start() 方法啟動線程。調用后,run 方法會在新線程中自動執行,但不會立刻執行

示例:

fun main() {val t = thread(start = false, block = {println("Hello, I'm ${Thread.currentThread().name}")})t.start()
}

或者直接設置 start = true(默認值):

fun main() {val t = thread(block = {println("Hello, I'm ${Thread.currentThread().name}")})
}

輸出示例:

Hello, i'm Thread-0

啟動線程的內部原理

線程啟動不會立即執行,啟動與運行之間存在延遲。線程默認是非守護線程

  • 守護線程不會阻止 JVM 退出;

  • 非守護線程還在運行時,JVM 不會退出;

  • 守護線程通常用于后臺任務。

注意

  • start() 會啟動新線程并執行 run() 方法;

  • 直接調用 run() 不會啟動新線程,只是在當前線程中執行;

  • 多次調用 start() 會拋出 IllegalThreadStateException

  • 多線程中的執行順序是不可預測的,除非使用了額外的同步機制。

示例代碼:

fun main() {val t1 = HelloThread()val t2 = HelloThread()t1.start()t2.start()println("Finished")
}

可能的輸出順序:

Hello, i'm Thread-1
Finished
Hello, i'm Thread-0

也可能是:

Finished
Hello, i'm Thread-0
Hello, i'm Thread-1

說明線程的啟動順序與實際運行順序可能不同。

一個簡單的多線程程序

下面是一個簡單的多線程示例:

一個線程不斷讀取用戶輸入并打印其平方,主線程則間歇性輸出消息。

工作線程類:

class SquareWorkerThread(name: String) : Thread(name) {override fun run() {while (true) {val number = readln().toInt()if (number == 0) {break}println(number * number)}println("$name's finished")}
}

主線程邏輯:

fun main() {val workerThread = SquareWorkerThread("square-worker")workerThread.start()for (i in 0 until 5_555_555_543L) {if (i % 1_000_000_000 == 0L) {println("Hello from the main!")}}
}

示例輸入與輸出(帶注釋):

Hello from the main!    // 主線程輸出
2                       // 輸入
4                       // 輸出平方
Hello from the main!    // 主線程輸出
3
9
5
Hello from the main!
25
0                       // 輸入 0 終止線程
square-worker finished  // 工作線程結束提示
Hello from the main!
Hello from the main!

最終輸出表明,兩個線程并發執行。雖然不是真正同時,但每個線程都得到了執行的機會。


總結

  • 如何創建線程對象;

  • 如何設置線程執行的代碼;

  • 如何啟動線程;

  • 線程背后的工作原理;

  • 線程運行的非確定性;

  • 簡單的多線程程序如何寫。

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

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

相關文章

2025真實面試試題分析-安卓客戶端開發

以下是對安卓客戶端開發工程師面試問題的分類整理、領域占比分析及高頻問題精選(基于??85道問題,總出現次數118次??)。按技術領域整合為??7大核心類別??,按占比排序并精選高頻問題標注優先級(1-5🌟…

算法學習筆記:29.拓撲排序——從原理到實戰,涵蓋 LeetCode 與考研 408 例題

拓撲排序(Topological Sorting)是一種針對有向無環圖(DAG)的線性排序算法,它將圖中的頂點按照一定規則排列,使得對于圖中的任意一條有向邊 u→v,頂點 u 都排在頂點 v 之前。拓撲排序在任務調度、…

利用Web3加密技術保障您的在線數據安全

在這個信息爆炸的數字化時代,保護個人和企業數據安全變得尤為重要。Web3技術以其去中心化和加密特性,為在線數據安全提供了新的解決方案。本文將探討Web3技術如何通過加密技術保障您的在線數據安全,并介紹如何有效利用這些技術。 什么是Web3技…

Vue實現el-checkbox單選并回顯選中

先說需求 我要在頁面進行checkbox單選并回顯 第一步先把基本的頁面寫好噢&#xff1a;vue代碼&#xff1a;別忘了寫change啊<el-form-item label"按鈕顏色:" prop"menuColor"><el-checkbox-group v-model"buttonColor" change"bin…

動態規劃--序列找優問題【1】

一、說明 動態規劃似乎針對問題很多&#xff0c;五花八門&#xff0c;似乎每一個問題都有一套具體算法。其實不是的&#xff0c;動態規劃只有兩類&#xff1a;1&#xff09;針對圖的路徑問題 2&#xff09;針對一個序列的問題。本篇講動態規劃針對序列的算法范例。 二、動態規劃…

獨家|百度副總裁尚國斌即將離職,此前統籌百度地圖;行業搜索及智能體業務總經理謝天轉崗IDG

百度人事再變動。作者|文昌龍編輯|楊舟據「市象」了解&#xff0c;近期&#xff0c;百度副總裁尚國斌即將離職。公開資料顯示&#xff0c;尚國斌2010年畢業于南開大學&#xff0c;2012年加入百度&#xff0c;先后在商業分析部、集團戰略辦、智能駕駛事業群工作。尚國斌同樣也在…

Qt 網絡編程進階:HTTP 客戶端實現

在 Qt 應用程序中&#xff0c;實現高性能、可靠的 HTTP 客戶端是常見需求。Qt 提供了豐富的網絡模塊&#xff0c;包括 QNetworkAccessManager、QNetworkRequest 和 QNetworkReply 等類&#xff0c;用于簡化 HTTP 通信。本文將深入探討 Qt 網絡編程中 HTTP 客戶端的進階實現&…

Python Requests-HTML庫詳解:從入門到實戰

一、庫簡介 Requests-HTML是Python中集網絡請求與HTML解析于一體的全能型庫&#xff0c;由知名開發者Kenneth Reitz團隊維護。它完美結合了Requests的易用性和Parsel的選擇器功能&#xff0c;并內置JavaScript渲染引擎&#xff0c;特別適合現代動態網頁抓取。最新版本&#xf…

基于springboot的小區車位租售管理系統

博主介紹&#xff1a;java高級開發&#xff0c;從事互聯網行業六年&#xff0c;熟悉各種主流語言&#xff0c;精通java、python、php、爬蟲、web開發&#xff0c;已經做了六年的畢業設計程序開發&#xff0c;開發過上千套畢業設計程序&#xff0c;沒有什么華麗的語言&#xff0…

Kafka 如何優雅實現 Varint 和 ZigZag 編碼

ByteUtils 是 Kafka 中一個非常基礎且核心的工具類。從包名 common.utils 就可以看出&#xff0c;它被廣泛用于 Kafka 的各個模塊中。它的主要職責是提供一套高效、底層的靜態方法&#xff0c;用于在字節緩沖區 (ByteBuffer)、字節數組 (byte[]) 以及輸入/輸出流 (InputStream/…

局域網 IP地址

很多童鞋搞不清楚局域網ip是什么? 什么是局域網 IP 地址? 局域網 IP 地址,也稱為 私有 IP 地址(Private IP Address),是用于在局域網內部標識設備的地址。這些地址不能直接在互聯網上被訪問,通常由路由器自動分配,用于設備之間的內部通信。 局域網 IP 地址的分類 根…

k8s的service、deployment、探針詳解

1.k8s組成圖2.service和deployment的流量轉發圖# Deployment 定義容器端口 apiVersion: apps/v1 kind: Deployment metadata:name: myapp spec:template:spec:containers:- name: nginximage: nginxports:- containerPort: 80 # 容器監聽 80name: http # 端口命名&…

【PostgreSQL教程】PostgreSQL中json類型與jsonb類型的區別

博主介紹:?全網粉絲23W+,CSDN博客專家、Java領域優質創作者,掘金/華為云/阿里云/InfoQ等平臺優質作者、專注于Java技術領域? 技術范圍:SpringBoot、SpringCloud、Vue、SSM、HTML、Nodejs、Python、MySQL、PostgreSQL、大數據、物聯網、機器學習等設計與開發。 感興趣的可…

牛客刷題記錄01

除2&#xff01; 目錄 除2&#xff01; 題目描述&#xff1a; ?編輯 題目解析&#xff1a; 代碼實現&#xff1a; 數組中兩個字符串的最小距離__牛客網 題目描述&#xff1a; 題目解析&#xff1a; 代碼實現&#xff1a; 除2&#xff01; 題目描述&#xff1a; 給一個…

Docker Compose UI遠程訪問教程:結合貝銳花生殼實現內網穿透

對于很多剛接觸Docker的用戶來說&#xff0c;命令行操作總帶著一絲“勸退感”。尤其是要在Windows上部署服務、開放端口、配置參數時&#xff0c;稍有不慎就容易出錯。有沒有辦法像網頁后臺一樣&#xff0c;用圖形界面來管理Docker項目呢&#xff1f;答案是&#xff1a;有&…

HF83311_VB1/HF83311Q_VB1:高性能USB HiFi音頻解碼器固件技術解析

引言隨著高品質音頻體驗需求的不斷增長&#xff0c;音頻解碼器固件的性能和功能成為決定音頻設備品質的關鍵因素。本文將介紹一款基于XMOS XU316技術的高性能USB HiFi音頻解碼器固件——HF83311_VB1/HF83311Q_VB1&#xff0c;這是一款專為USB HiFi音頻應用設計的軟件解決方案。…

[ComfyUI] -入門1-ComfyUI 是什么?比 Stable Diffusion WebUI 強在哪?

ComfyUI 是一個開源的、節點可視化界面,用于構建與執行 Stable Diffusion 圖像生成流程。它把復雜的生成過程拆解為許多“節點”(如提示編碼、采樣器、控制網絡等),用戶通過連接節點,就能自由編排工作流 。這種設計適合開發者與進階用戶,更便于微調、多分支與復用流程。 …

[python][flask]flask接受get或者post參數

在 Flask 中&#xff0c;可以通過 request 對象來獲取客戶端通過 GET 或 POST 方法發送的參數。以下是如何在 Flask 中接收 GET 和 POST 參數的詳細說明&#xff1a;1. 接收 GET 參數GET 請求的參數通常通過 URL 的查詢字符串傳遞。例如&#xff0c;對于 URL http://example.co…

Creo 模塊眾多,企業如何按需靈活分配許可證資源?

在數字化設計與智能制造深入發展的當下&#xff0c;企業 CAD/CAE 工具的精細化管理越來越重要。Creo&#xff0c;作為 PTC 旗下一體化 3D CAD 平臺&#xff0c;以其模塊化、可擴展的產品架構&#xff0c;廣泛應用于機械、裝備、汽車、航空航天等行業。其豐富的模塊庫覆蓋建模設…

【c++】提升用戶體驗:問答系統的交互優化實踐——關于我用AI編寫了一個聊天機器人……(12)

本期依舊使用豆包輔助完成代碼。從功能到體驗的轉變上個版本已經實現了問答系統的核心功能&#xff1a;基于 TF-IDF 算法的問題匹配和回答。它能夠讀取訓練數據&#xff0c;處理用戶輸入&#xff0c;并返回最相關的答案。但在用戶體驗方面還有很大提升空間。讓我們看看改進版做…