線程-Thread類及常見方法

目錄

一、創建線程

1.繼承 Thread 類

2.?實現 Runnable 接口

?3.匿名內部類創建 Thread 子類對象

4.?匿名內部類創建 Runnable 子類對象

5.?lambda 表達式創建 Runnable 子類對象

二、Thread 類及常見方法?

2.1 Thread 的常見構造方法

?2.2 Thread 的幾個常見屬性

2.3 啟動一個線程-start()

2.4 中斷一個線程 ?

2.5 等待一個線程-join()

三. 線程的狀態


若想了解線程的基本概念,請參照另一篇博文 :進程和線程?

一、創建線程

1.繼承 Thread

1) 繼承 Thread 來創建一個線程類 .
class MyThread extends Thread {@Overridepublic void run() {System.out.println("這里是線程運行的代碼");}
}

?2) 創建 MyThread 類的實例

Thread t = new MyThread();

?3) 調用 start 方法啟動線程

t.start(); // 線程開始運行

2.?實現 Runnable 接口

1)通過?類 實現 Runnable 接口,重寫run方法,Runnable 接口表示一個“可執行的任務”,交給線程來使用。
class MyRunnable implements Runnable {@Overridepublic void run() {System.out.println("這里是線程運行的代碼");}
}

?2) 創建 Thread 類實例, 調用 Thread 的構造方法時將 Runnable 對象作為 target 參數.

 Thread t = new Thread(new MyRunnable());
//或者Runnable runnable = new MyRunnable();Thread t = new Thread(runnable);

?3) 調用 start 方法

t.start(); // 線程開始運行

對比上面兩種方法:

  • 繼承 Thread , 直接使用 this 就表示當前線程對象的引用.
  • 實現 Runnable 接口, this 表示的是 MyRunnable 的引用. 需要使用 Thread.currentThread(),當前線程實例對象。

?3.匿名內部類創建 Thread 子類對象

????????????在創建Thread類的對象時使用匿名內部類,并重寫方法。

    public static void main(String[] args) {Thread t = new Thread() {@Overridepublic void run() {while (true) {System.out.println("hello thread");try {Thread.sleep(1000);} catch (InterruptedException e) {e.printStackTrace();}}}};t.start();
}

4.?匿名內部類創建 Runnable 子類對象

public static void main(String[] args) {   Thread t = new Thread(new Runnable() {@Overridepublic void run() {while (true) {System.out.println("hello thread");try {Thread.sleep(1000);} catch (InterruptedException e) {e.printStackTrace();}}}});t.start();
}

5.?lambda 表達式創建 Runnable 子類對象

????????該方法是最簡便創建線程的方法,?lambda 表達式本質上是一個函數式接口(一個接口中只有一個抽象方法),自身就是run方法,表示邏輯。? ?

???????? lambda 表達式可以理解為:匿名內部類的簡化,實際上為創建了一個類,實現接口,并重寫方法。

//eg:  (函數式接口參數)-> 表達式 / {代碼塊};public static void main(String[] args) {Thread t = new Thread(() -> {while (true) {System.out.println("hello thread");try {Thread.sleep(1000);} catch (InterruptedException e) {e.printStackTrace();}}});t.start();
}

二、Thread 類及常見方法?

????????Thread 類是 JVM 用來管理線程的一個類,換句話說,每個線程都有一個唯一的 Thread 對象與之關聯。

????????Thread 類的對象就是用來描述一個線程執行流的,JVM 會將這些 Thread 對象組織起來,用于線程調度,線程管理。

?????????????????????????

2.1 Thread 的常見構造方法

Thread t1 = new Thread();
Thread t2 = new Thread(new MyRunnable());
Thread t3 = new Thread("這是我的名字");
Thread t4 = new Thread(new MyRunnable(), "這是我的名字");

?2.2 Thread 的幾個常見屬性

  1. getId() ,ID 是線程的唯一標識,不同線程不會重復
  2. getName(),名稱是各種調試工具用到
  3. getState(),狀態表示線程當前所處的一個情況,下面我們會進一步說明
  4. getPriority(),優先級高的線程理論上來說更容易被調度到
  5. isDaemon()?關于后臺線程,需要記住一點:JVM會在一個進程的所有非后臺線程結束后,才會結束運行。
  6. isAlive() ,是否存活,即簡單的理解,為 run 方法是否運行結束了
  7. isInterrupted() ,線程中斷。

?Thread.currentThread(),返回當前線程實例對象。

public class ThreadDemo {public static void main(String[] args) {Thread thread = new Thread(() -> {for (int i = 0; i < 10; i++) {try {System.out.println(Thread.currentThread().getName() + ": 我還
活著");Thread.sleep(1 * 1000);} catch (InterruptedException e) {e.printStackTrace();}}System.out.println(Thread.currentThread().getName() + ": 我即將死去");});System.out.println(Thread.currentThread().getName() + ": ID: " + thread.getId());System.out.println(Thread.currentThread().getName() + ": 名稱: " + thread.getName());System.out.println(Thread.currentThread().getName() + ": 狀態: " + thread.getState());System.out.println(Thread.currentThread().getName() + ": 優先級: " + thread.getPriority());System.out.println(Thread.currentThread().getName() + ": 后臺線程: " + thread.isDaemon());System.out.println(Thread.currentThread().getName() + ": 活著: " + thread.isAlive());System.out.println(Thread.currentThread().getName() + ": 被中斷: " + thread.isInterrupted());thread.start();while (thread.isAlive()) {}System.out.println(Thread.currentThread().getName() + ": 狀態: " + thread.getState());}
}

2.3 啟動一個線程-start()

????????? 之前我們已經看到了如何通過覆寫 run 方法創建一個線程對象,但線程對象被創建出來并不意味著線程就開始運行了。

? ? ? ? start()內部是會調用到系統api,在系統內核中創建線程

? ? ? ? run(),單純描述了該線程要執行什么工作。

? ? ? ? 本質區別 在于是否在系統內核中創建了一個線程。

2.4 中斷一個線程 ?

? ? ? ? interrupt中斷,讓一個線程停止運行run方法,

目前常見的有以下兩種方式:

  • 通過共享的標記來進行溝通,手動設置標志位。
  • 調用 interrupt() 方法來通知,Thread 內部包含了一個 boolean 類型的變量作為線程是否被中斷的標記.使用 Thread.interrupted() 或者 Thread.currentThread().isInterrupted() 代替自定義標志位。

thread 收到通知的方式有兩種:
1. 如果線程因為調用 wait/join/sleep 等方法而阻塞掛起,則以 InterruptedException 異常的形式通知,清除中斷標志

  • 當出現 InterruptedException 的時候, 要不要結束線程取決于 catch 中代碼的寫法. 可以選擇忽略這個異常, 也可以跳出循環結束線程.
2. 否則,只是內部的一個中斷標志被設置, thread 可以通過
  • Thread.interrupted() 判斷當前線程的中斷標志被設置,清除中斷標志
  • Thread.currentThread().isInterrupted() 判斷指定線程的中斷標志被設置,不清除中斷標志
這種方式通知收到的更及時,即使線程正在 sleep 也可以馬上收到。

????????如下代碼就是第一種?因為調用 wait/join/sleep 等方法而阻塞掛起,則以 InterruptedException 異常的形式通知,清除中斷標志,所以線程run并沒有結束,可以拋出異常break解決。

package thread;// 線程終止
public class Demo9 {public static void main(String[] args) {Thread t = new Thread(() -> {// Thread 類內部, 有一個現成的標志位, 可以用來判定當前的循環是否要結束.while (!Thread.currentThread().isInterrupted()) {System.out.println("線程工作中");try {Thread.sleep(1000);} catch (InterruptedException e) {// 1. 假裝沒聽見, 循環繼續正常執行.e.printStackTrace();// 2. 加上一個 break, 表示讓線程立即結束.// break;// 3. 做一些其他工作, 完成之后再結束.// 其他工作的代碼放到這里.break;}}});t.start();try {Thread.sleep(5000);} catch (InterruptedException e) {e.printStackTrace();}System.out.println("讓 t 線程終止. ");t.interrupt();}
}

2.5 等待一個線程-join()

????????有時,我們需要等待一個線程完成它的工作后,才能進行自己的下一步工作。這時我們需要一個方法明確等待線程的結束。 ? ? ? ?

???????? 主線程中,調用t.join() => 主線程等待 t 線程先結束。

. 線程的狀態

????????線程的狀態是一個枚舉類型 Thread.State

public class ThreadState {public static void main(String[] args) {for (Thread.State state : Thread.State.values()) {System.out.println(state);}}
}

  • NEW: 安排了工作, 還未開始行動
  • RUNNABLE: 可工作的. 又可以分成正在工作中和即將開始工作.
  • BLOCKED: 這幾個都表示排隊等著其他事情
  • WAITING: 這幾個都表示排隊等著其他事情
  • TIMED_WAITING: 這幾個都表示排隊等著其他事情
  • TERMINATED: 工作完成了.
//示例
package thread;public class Demo12 {public static void main(String[] args) throws InterruptedException {Thread t = new Thread(() -> {while (true) {try {Thread.sleep(1000);} catch (InterruptedException e) {e.printStackTrace();}}});// 在調用 start 之前獲取狀態, 此時就是 NEW 狀態System.out.println(t.getState());t.start();for (int i = 0; i < 5; i++) {System.out.println(t.getState());Thread.sleep(1000);}t.join();// 在線程執行結束之后, 獲取線程的狀態, 此時是 TERMINATED 狀態System.out.println(t.getState());}
}

?結語:Thread類及常見方法的相關分享到這里就結束了,希望對大家的學習會有幫助,如果大家有什么問題或者不同的見解,歡迎大家評論區的留言,?感謝支持 !!!

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

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

相關文章

C++初級項目webserver項目流程介紹(2)

一、引言 C的webserver項目是自己在學完網絡編程后根據網課的內容做的一個初級的網絡編程項目。 這個項目的效果是可以在瀏覽器通過輸入網絡IP地址和端口&#xff0c;然后打開對應的文件目錄 效果如下&#xff1a; 也可以打開文件夾后點擊目錄&#xff0c;打開到對應的文件夾…

Vue中項目進行文件壓縮與解壓縮 (接口返回文件的url壓縮包前端解析并展示出來,保存的時候在壓縮后放到接口入參進行保存)

安裝 npm install pako在Vue組件中引入pako&#xff1a; import pako from pako;接口返回的url是這個字段 tableSsjsonUrl 其實打開就是壓縮包const source await tableFileUrl ({ id: this.$route.query.id}); if(source.code 0) {this.titleName source.data.tableNam…

ES之x-pack-core-7.14.2許可證修改為白金版

X-Pack是什么 X-pack是elasticsearch的一個擴展包&#xff0c;將安全&#xff0c;警告&#xff0c;監視&#xff0c;圖形和報告功能捆綁在一個易于安裝的軟件包中&#xff0c;雖然x-pack被設計為一個無縫的工作&#xff0c;但是你可以輕松的啟用或者關閉一些功能。 主要分一下步…

WebSocket 鑒權策略與技巧詳解

WebSocket 作為實時通信的利器&#xff0c;越來越受到開發者的青睞。然而&#xff0c;為了確保通信的安全性和合法性&#xff0c;鑒權成為不可或缺的一環。本文將深入探討 WebSocket 的鑒權機制&#xff0c;為你呈現一攬子的解決方案&#xff0c;確保你的 WebSocket 通信得心應…

【Qt之QTextDocument】使用及表格顯示富文本解決方案

【Qt之QTextDocument】使用 描述常用方法及示例使用QTextList使用QTextBlock使用QTextTable表格顯示富文本結論 描述 QTextDocument類保存格式化的文本。 QTextDocument是結構化富文本文檔的容器&#xff0c;支持樣式文本和各種文檔元素&#xff0c;如列表、表格、框架和圖像。…

CANopen協議【SDO】

SDO&#xff1a; SDO是讀寫單個寄存器。主要用于配置伺服驅動器參數。 1 收發功能&#xff1a; //public unsafe struct VCI_CAN_OBJ //CAN數據幀 【單幀對象】//{// public uint ID;// 幀ID。 【11bit】數據右對齊。 詳情請參照&#xff1a; 《8.附件1&#xff1…

Python 模塊

目錄 模塊 6.1. 模塊詳解 6.1.1. 以腳本方式執行模塊 6.1.2. 模塊搜索路徑 6.1.3. “已編譯的” Python 文件 6.2. 標準模塊 6.3. dir() 函數 6.4. 包 6.4.1. 從包中導入 * 6.4.2. 相對導入 6.4.3. 多目錄中的包 模塊 退出 Python 解釋器后&#xff0c;再次進入時&a…

手把手教你安裝 Visual Studio 2022 及其簡單使用

軟件下載 打開 Visual Studio 官網&#xff0c;個人選擇免費的Community社區版就夠用了。 軟件安裝 雙擊運行安裝程序&#xff1a; 點擊繼續 即可&#xff1a; 等待加載完成&#xff1a; 可以看到 Visual Studio 2022 對應不同的開發需求提供了若干工作負載&#xff0c;這里以…

?3ds Max插件CG MAGIC圖形板塊為您提升線條效率!

?通過3ds Max軟件進行繪圖操作時&#xff0c;大多絆住各位設計師們作圖速度的往往都是一些細微的瑣事&#xff0c;重復一變一變的調整修改等問題。 今天說到這個繪圖線條來回調整解決方法就是3ds Max插件CG MAGIC。 Max插件CG MAGIC作為一款智能化的輔助插件&#xff0c;致力于…

flutter編譯和構建鴻蒙應用程序(windows環境)

flutter編譯和構建鴻蒙應用程序&#xff08;windows環境&#xff09; 問題背景 針對 OpenHarmony 的 Flutter 版本已經開源&#xff0c;參考 https://gitee.com/openharmony-sig/flutter_flutter。 本文為實踐該流程&#xff0c;實現flutter打包鴻蒙hap包的流程。目前流程已經…

flink的java.lang.IllegalStateException: Buffer pool is destroyed 異常

背景 最近flink的在線應用出現錯誤java.lang.IllegalStateException: Buffer pool is destroyed&#xff0c;本文記錄下這個錯誤的原因 錯誤原因 詳細的日志堆棧如下: Caused by: java.lang.IllegalStateException: Buffer pool is destroyed. at org.apache.flink.runtime…

Ps:畫筆工具的基本操作

畫筆工具 Brush Tool是 Ps 中最常用的工具&#xff0c;廣泛地用于繪畫與修飾工作。 雖然多數操作可在畫筆工具的工具選項欄中選擇執行&#xff0c;但是如果能記住相應的快捷鍵可大大提高工作效率。 熟練掌握畫筆工具的操作對于使用其他工具也非常有益&#xff0c;因為 Ps 中許多…

CSS-長度單位篇

px&#xff1a;像素em&#xff1a;相對元素font-size的倍數rem&#xff1a;相對根字體大小&#xff0c;html標簽就是根%&#xff1a;相對父元素計算 注意&#xff1a;CSS中設置長度&#xff0c;必須加單位&#xff0c;否則樣式無效&#xff01;

Maven - 打包之爭:Jar vs. Shade vs. Assembly

文章目錄 Pre概述Jar 打包方式_maven-jar-pluginOverview使用官方文檔 Shade 打包方式_maven-shade-pluginOverview使用將部分jar包添加或排除將依賴jar包內部資源添加或排除自動將所有不使用的類排除將依賴的類重命名并打包進來 &#xff08;隔離方案&#xff09;修改包的后綴…

ElasticSearch之cat component templates API

命令樣例如下&#xff1a; curl -X GET "https://localhost:9200/_cat/component_templates?vtrue&pretty" --cacert $ES_HOME/config/certs/http_ca.crt -u "elastic:ohCxPHQBEs5*lo7F9"執行結果輸出如下&#xff1a; name …

Qt/QML編程學習之心得:一個QML工程的學習筆記(十)

前言: 到底什么是Qt Quick呢?因為Qt Quick是Qt新引入的,Qt Quick由Qt Quick模塊提供,它是一個編寫QML應用的標準庫。Qt Quick模塊提供了兩種接口:使用QML語言創建應用的QML接口和使用C++語言擴展QML的C++接口。使用Qt Quick模塊,設計人員和開發人員可以輕松地構建流暢的…

【自主探索】基于 frontier_exploration 的單個機器人自主探索建圖

文章目錄 一、概述1、功能2、要求 二、使用方法1、用于運行演示2、用于開發人員2.1. 探索無/地圖數據2.2. 使用 /map 數據進行探索 三、提供的組件1、explore_client1.1. 調用的操作1.2. 訂閱主題1.3. 發布主題 2、explore_server2.1. 提供的操作2.2. 調用的操作2.3. 調用的服務…

【科技素養】藍橋杯STEMA 科技素養組模擬練習試卷6

1、將一個空塑料袋與一個裝滿空氣的塑料袋放到秤上稱重。在兩個塑料袋本身完全一樣的情況下&#xff0c;得出的結果會是 A、空塑料袋更重 B、裝滿空氣的塑料袋更重 C、兩個塑料袋一樣重 D、無法判斷 答案&#xff1a;C 2、全球變暖帶來的一個主要影響就是海平面的上升。造…

web前端開發基礎----標準流布局和非標準流布局

1&#xff0c;標準流布局 標準流&#xff0c;也稱文檔流或普通流&#xff0c;是所有元素默認的布局方式。 在標準流中&#xff0c;元素按照其在 HTML 中出現的順序&#xff0c;自上而下依次排列&#xff0c;并占據其父容器內的可用空間。 標準流中的元素按照其自然尺寸和位置進…

uniapp實現多時間段設置

功能說明&#xff1a; 1 點擊新增時間&#xff0c;出現一個默認時間段模板&#xff0c;不能提交 2 點擊“新增時間文本”&#xff0c;彈出彈窗&#xff0c;選擇時間&#xff0c;不允許開始時間和結束時間同時為00:00&#xff0c; <view class"item_cont"> …