Thread類常用成員方法

點擊鏈接返回標題->

Java線程的學習-CSDN博客


目錄

前言

有關線程名字的成員方法:

String getName()

void setName(String name)

Thread(String name)

?獲取線程對象的成員方法:

static Thread currentThread()

讓線程睡眠的成員方法:

static void sleep(long time)?throws InterruptedException

有關線程優先級的成員方法

int getPriority()

void setPriority(int newPriority)

守護線程

void setDaemon(boolean on)

禮讓線程

?static void yield()

插入線程?

void join() throws InterruptedException



前言

在上一篇中學習了多線程的3種實現方式,其實已經不可避免地涉及到了Thread類的部分成員方法,有用setName()方法設置線程名字,用getName()方法獲取當前線程名字,以及一個Thread類的靜態方法currentThread()可以獲取到當前線程的實例化對象。

本篇我們就來系統性地學習、記錄一下Thread類中常用的成員方法。


有關線程名字的成員方法:

String getName()

該方法將以String對象返回當前線程的名字。

特殊的,如果未設置線程名,該方法將返回"Thread-number",其中number按線程的實例化順序從0開始編號自增。

特殊的,main方法執行的進程(即主進程)名字默認為main,下面兩張圖驗證了這個說法——

示例代碼:


void setName(String name)

調用該方法時傳入String對象,將為當前線程設置名字,前文已經多次涉及。

Thread(String name)

該方法是Thread類的有參構造方法,在實例化線程對象時傳入String對象可以直接完成線程名字設置。

需要注意的是!通常我們會通過自定義子類繼承Thread類的方式來實現多線程,但子類不會繼承父類的構造方法!因此這種情況下必須使用super關鍵字去調用父類的構造方法。

示例代碼:

部分運行結果:

測試代碼:

public class Main {public static void main(String[] args) {myThread t1 = new myThread();//實例化對象,線程t1myThread t2 = new myThread("有參構造設置名稱");//實例化對象,線程t2并調用有參構造給線程設置名稱t1.setName("線程1");//設置線程t1的名字t1.start();//啟動線程t1t2.start();//啟動線程t2}
}class myThread extends Thread {//自定義子類myThread繼承Thread類myThread() {}myThread(String name) {super(name);System.out.print("有參構造被調用");}@Overridepublic void run() {//重寫run()方法for (int i = 1; i <= 100; i++) {System.out.println("當前線程名字為:" + getName());}}
}


?獲取線程對象的成員方法:

static Thread currentThread()

這個方法可以獲取當前線程的實例化對象,前面已經多次涉及。

對于主線程main,這里補充了一些細節——

  • 當JVM虛擬機啟動之后,會自動啟動多條線程
  • 其中一條線程就叫main線程
  • 它的作用就是去調用main方法,并執行里面的代碼
  • 在以前,我們寫的所以代碼,其實都是運行在main線程中(沒有開多線程)

讓線程睡眠的成員方法:

static void sleep(long time)?throws InterruptedException

這個方法是Thread的靜態方法,它的作用時讓當前線程“睡眠”(即暫停運行)time毫秒

注意time的單位是毫秒->1秒(s)等于1000毫秒(ms)

調用該靜態方法的方法需要聲明拋出InterruptedException異常類或者用try...catch...finally語句處理異常,否則代碼無法運行。

示例代碼:

public class Main {public static void main(String[] args) throws InterruptedException {System.out.println("第一句話打印完后main線程睡眠7秒");Thread.sleep(7000);System.out.println("然后繼續打印第二句話");}
}

上面的示例展示了main進程的睡眠,如果是在新開的自定義進程睡眠的話,有些許不同之處。主要原因在于,在Thread這個父類中沒有聲明拋出InterruptedException異常類,所以自定義的子類也不能聲明拋出異常,解決方法是使用try...catch...finally語句進行異常處理

有關異常類見本篇->Java異常-CSDN博客

示例代碼:

部分運行結果:

public class Main {public static void main(String[] args) throws InterruptedException {myThread t1 = new myThread();myThread t2 = new myThread();t1.start();t2.start();}
}class myThread extends Thread {//自定義子類myThread繼承Thread類@Overridepublic void run() {//重寫run()方法for (int i = 1; i <= 100; i++) {System.out.println("當前線程名字為:" + getName());try {Thread.sleep(2000);} catch (InterruptedException e) {throw new RuntimeException(e);}}}
}


有關線程優先級的成員方法

計算機當中,線程的調度有兩種方式——

  • 搶占式調度:這種方式下,線程完全隨機被調度,(假設共3個線程)1完了可能是3,3完了可能是1,接著可能是2,純靠隨機調度(不同線程擁有不同的優先級,優先級越高的線程,被調度的概率越大)。
  • 輪流式調度:這種方式下,線程按順序輪流調度,(假設共3個線程)1完了到2,2完了到3,3完了又回到1。

在Java中,運用的是搶占式調度,線程的優先級共10級,級別越大的線程其優先級越高,搶到cpu執行權的概率越大,被調度的概率越大。

下圖展示了Thread類的源碼,其中有3個成員變量,分別表示最低級別1、默認級別5、最高級別10。

int getPriority()

這個方法用來獲取當前線程的優先級,對于未設置過優先級的線程,優先級默認為5

下圖示例代碼驗證了這個說法——


void setPriority(int newPriority)

這個方法用來設置當前線程的優先級,傳入一個1到10之間整數進行設置。

示例代碼:

public class Main {public static void main(String[] args) throws InterruptedException {Thread t = Thread.currentThread();//獲取當前線程(即主線程)的實例化對象System.out.println("主線程的優先級為:" + t.getPriority());//打印當前線程的優先級myThread myt1 = new myThread();myThread myt2 = new myThread();//自定義兩個線程myt1.setName("線程1");myt2.setName("線程2");//設置兩個線程的名字myt1.start();myt2.start();//啟動兩個線程myt1.setPriority(1);myt1.setPriority(10);//分別設置優先級為1和10,顯然線程2的優先級更大,被調度的概率更高}
}class myThread extends Thread {//自定義子類myThread繼承Thread類@Overridepublic void run() {//重寫run()方法for (int i = 1; i <= 100; i++) {System.out.println(getName() + "打印了" + i);}}
}


守護線程

被設置為守護線程的線程將在其它非守護線程執行完畢后,陸續結束執行(注意此處“陸續”的含義,不是立刻結束)

光看定義確實十分抽象,因此舉了一個實際應用場景的例子:

如下圖是很常見的qq傳輸文件場景,對于這個聊天頁面,可以認為是線程1,對于傳送文件這個過程,可以認為是線程2。

在傳輸過程中,如果你突然關閉了這個聊天窗口(即結束了線程1),這個時候線程2就會跟著一起結束執行,這種關系下線程2就被稱為守護線程。

void setDaemon(boolean on)

這個方法用來設置線程為守護線程,傳入一個布爾類型的值true,表示將當前線程設置為守護線程。

代碼示例——

public class Main {public static void main(String[] args) throws InterruptedException {myThread1 t1 = new myThread1();myThread2 t2 = new myThread2();t1.setName("線程1");t2.setName("線程2");//分別命名t2.setDaemon(true);//將線程2設置為守護線程t1.start();t2.start();}
}class myThread1 extends Thread {//這個線程是非守護線程@Overridepublic void run() {//重寫run()方法,打印10次for (int i = 1; i <= 10; i++) {System.out.println(getName() + "打印了" + i);}}
}class myThread2 extends Thread {//這個線程是守護線程@Overridepublic void run() {//重寫run()方法,打印100次for (int i = 1; i <= 100; i++) {System.out.println(getName() + "打印了" + i);}}
}


禮讓線程

在多線程中常常遇到下圖這種情況,連續好幾次一直被同一個線程搶占到cpu的執行權(雖說默認優先等級都是5,但耐不住有的線程比較“歐”

禮讓線程的含義就是讓當前線程讓出當前的cpu執行權,注意,讓出執行權之后并不是說執行權就一定給別的線程了,而是讓別的線程有更多機會來跟自己搶奪執行權(我只是給你機會,又沒說一定給你是吧),所以說讓出執行權后又再次搶到的可能也是存在的!

?static void yield()

該靜態成員方法用來禮讓線程,讓出執行權給其它線程更多的執行機會,在一定程度上使執行權均勻分配。


插入線程?

void join() throws InterruptedException

該方法用于將當前線程插入到另一線程之前,被插入的線程結束前不會執行它后面的線程。

調用該靜態方法的方法需要聲明拋出InterruptedException異常類或者用try...catch...finally語句處理異常,否則代碼無法運行。

需要注意的是,插入操作必須寫在啟動操作之后(即先start后join)!

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

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

相關文章

時間序列分析算法的概念、模型檢驗及應用

時間序列分析是一種用于研究隨時間變化的數據模式和趨勢的統計方法。這類數據通常按照時間順序排列&#xff0c;例如股票價格、氣溫、銷售額等。時間序列分析的目標是從過去的觀測中提取信息&#xff0c;以便預測未來的趨勢。 以下是關于時間序列分析的一些重要概念、模型檢驗…

python 數據類型之集合

常見的數據類型&#xff1a; int&#xff0c;整數類型&#xff08;整形&#xff09;bool&#xff0c;布爾類型str&#xff0c;字符串類型list&#xff0c;列表類型tuple&#xff0c;元組類型dict&#xff0c;字典類型&#xff0c;一個容器且元素必須是鍵值對。set&#xff0c;…

I Doc View在線文檔預覽系統RCE漏洞(QVD-2023-45061)

0x01 產品簡介 iDocView是一個在線文檔解析應用&#xff0c;旨在提供便捷的文件查看和編輯服務。 0x02 漏洞概述 漏洞成因 本次漏洞出現在在線文檔解析應用中的遠程頁面緩存功能。具體問題在于該應用未能對用戶輸入的URL進行充分的安全驗證&#xff0c;從而導致存在安全隱患…

前端實現菜單快速檢索的功能

前端CSS <style type"text/css">.btn-box {color: #fff;width: auto;border-radius: 25px;min-width: 40px;height: 40px;margin: 9px;line-height: 40px;display: inline-block;position: relative;overflow: hidden;background-image: linear-gradient(315de…

紅隊攻防實戰之內網穿透隱秘隧道搭建

別低頭&#xff0c;皇冠會掉&#xff1b;別流淚&#xff0c;賤人會笑。 本文首發于先知社區&#xff0c;原創作者即是本人 0x00 前言 構建內網隱蔽通道&#xff0c;從而突破各種安全策略限制&#xff0c;實現對目標服務器的完美控制。 當我們從外網成功獲得攻擊點的時候&…

SAP BAPI For LU01/LU04 記賬更改

場景&#xff1a;采購收貨質檢放行的時候&#xff0c;發現存在有些做QA11的時候&#xff0c;進入到TR-ZONE中&#xff0c;沒有進入到指定的倉位 解決方案&#xff1a;前端通過LU04進入&#xff0c;可以查看到一些未清的記賬更改通知單&#xff0c;點擊工具欄上的創建轉儲單&am…

Docker Swarm總結+service創建和部署、overlay網絡以及Raft算法(2/3)

博主介紹&#xff1a;Java領域優質創作者,博客之星城市賽道TOP20、專注于前端流行技術框架、Java后端技術領域、項目實戰運維以及GIS地理信息領域。 &#x1f345;文末獲取源碼下載地址&#x1f345; &#x1f447;&#x1f3fb; 精彩專欄推薦訂閱&#x1f447;&#x1f3fb;…

新的預測模型的局部評價指標-pAUROCc

新的預測模型的局部評價指標-pAUROCc Background 局部評價主要是用在不平衡數據上&#xff0c;其合理性&#xff1a;1.局部評價比全局評價敏感&#xff0c;更容易區分模型的優劣&#xff1b;2.臨床決策曲線&#xff08;DCA&#xff09;可知&#xff0c;模型使用過程中&#x…

什么是JSX

在React組件中&#xff0c;JSX&#xff08;JavaScript XML&#xff09;是一種語法擴展&#xff0c;用于描述組件的結構和外觀。JSX允許我們在JavaScript中編寫類似HTML的標記語言&#xff0c;以創建React元素。 在React組件中&#xff0c;render方法是用于定義并返回組件的結構…

HarmonyOS開發(六):構建簡單頁面

1、Column&Row組件 1.1、概述 一個頁面由很多組件組成&#xff0c;如果需要把這些組件組織起來布局好&#xff0c;需要借助容器組件來實現。 容器組件是一種特殊的組件&#xff0c;它可以包含其他組件&#xff0c;而且按照一定的規律布局&#xff0c;一個容器組件中可以…

Linux--初識和基本的指令(2)

目錄 前言 1. 指令 1.1 cd其它攜帶指令 1.2 ls其它攜帶指令 1.3 which指令 1.4 alias指令 1.5 mkdir其他攜帶指令 1.7 yum -y install 安裝指令 1.8 stat指令 1.9解決指令失控狀態 1.10 rmdir&&rm指令 1.11 man指令 1.12 cp指令 1.13 mv指令 1.14 nano…

vue項目引入中國地圖

先安裝有china.js的版本 npm install echarts4.8 --save //以前的版本有china.js <template><div class"mapMain"><div id"map" style"width: 30vw; height: 30vw;" /></div> </template><script>//引入文…

提高蘋果企業簽名穩定性的關鍵方法包括幾點

提高蘋果企業簽名穩定性的關鍵方法包括以下幾點&#xff1a; 控制簽名量&#xff1a;蘋果企業簽名的穩定性與每本書的簽發量有很大的關系。一般來說&#xff0c;每本書上簽10個APP和每本書上簽100個APP是兩種不同的概念。為了提高穩定性&#xff0c;正規的簽名平臺會嚴格控制每…

「純電」廝殺,廣州車展的年末大戲

作者 |張祥威 編輯 |德新 年末的廣州車展&#xff0c;揭開純電動車激烈廝殺的一角。 1100多款車型亮相在這屆車展&#xff0c;其中新能源車有460多輛&#xff0c;占接近一半比例。這其中&#xff0c;人們的焦點又放在十多款純電車型上。 造車新勢力中&#xff0c;理想的首款…

什么是數據確權?

在數字化時代&#xff0c;數據已經成為一種新型資產&#xff0c;”新的石油“&#xff0c;具有巨大的價值&#xff0c;未來世界經濟競爭一定程度上是數字經濟的競爭&#xff0c;而非工業的競爭。數據相關法律制度&#xff0c;尚且還不完整&#xff0c;推動數字經濟的發展&#…

工作流引擎的主要表結構

工作流引擎的主要表結構及其作用如下&#xff0c;我們從開源的馳騁工作流為例來說明。 1. WF_GenerWorkFlow&#xff1a;該表主要用于存儲流程引擎級別的數據, 發起人&#xff0c;發起日期&#xff0c;workid, 流程狀態&#xff0c;流程標題&#xff0c;運行到的節點。 2. WF_…

快速入門go語言學習筆記

文章目錄 1、初識go1.1、go語言1.2 第一個Go程序 2、基礎類型2.1、命名2.2、變量2.2.1 變量聲明2.2.2 變量初始化2.2.3 變量賦值2.2.4 匿名變量 2.3、常量2.3.1 字面常量(常量值)2.3.2 常量定義2.3.3 iota枚舉 2.4、基礎數據類型2.4.1 分類2.4.2 布爾類型2.4.3 整型2.4.4 浮點型…

逆向扒cocosjs安卓包教程-破解加密的js源碼

本文只適用于cocosjs引擎打包的游戲apk,針對此類apk進行源碼級別的逆向破解,可直接逐個破解工程內的源碼部分,讓游戲邏輯大白于你的面前,你可以針對js源碼進行二次開發。按照我的教程破解過程中遇到什么問題,歡迎留言。 準備apk包 準備一個你確定用cocosjs打包好的apk包…

XSLVGL2.0 User Manual 資源管理器(v2.0)

XSLVGL2.0 開發手冊 XSLVGL2.0 User Manual 資源管理器 1、概述2、特性3、APIs3.1、xs_resource_get3.2、xs_resource_get_string3.3、xs_resource_set_search_dir3.4、xs_resource_bind_id3.5、xs_resource_set_lang_desc3.6、xs_resource_update3.7、xs_resource_unbind_id3…