多線程 02

?1.線程的常見構造方法

方法說明
Thread()創建線程對象
Thread(Runnable target)使用 Runnable 對象創建線程對象
Thread(String name)創建線程對象,并命名
Thread(Runnable target, String name)使用 Runnable 對象創建線程對象,并命名
【了解】Thread(ThreadGroup group,
Runnable target)
線程可以被用來分組管理,分好的組即為線程組,這
個目前我們了解即可

2.線程的幾個屬性和方法

屬性獲取方法
IDgetId()
名稱getName()
狀態getState()
優先級getPriority()
是否后臺線程isDaemon()
是否存活isAlive()
是否被中斷isInterrupted()

這里的后臺線程和前臺線程不同,當所有的前臺線程執行完畢,即使后臺線程還在工作中,也會直接自動退出.

只要前臺線程沒執行完,進程就不會結束,即使main結束了,前臺線程也會繼續執行

設置為后臺進程

setDaemon()設為true就是后臺,不設置就是默認前臺

isAlive()表示內核中的PCB是否存在

這個對象的生命周期和PCB的是不完全一樣的

因為我在創建對象之后這個PCB才存在,在執行完進程結束后之后這個PCB才銷毀,而且java中的用戶級線程不是直接映射到操作系統中的原生線程的

3.創建線程的5個方式

其實線程是操作系統提供的一種機制,并給用戶提供了一些api供使用,Java的Thread類只是對其的進一步封裝.

1.繼承Thread類,重寫run方法

2.重寫runnable接口

3.使用匿名內部類實現Thread

4.使用匿名內部類實現Runnable接口

5.使用Lambda表達式

4.start()和run()方法的區別

說實話這兩個方法是八竿子打不著的,為什么要把他們兩個放進來比較呢?

可能有人認為start方法和run方法執行的是一件事情

其實這個理解是大錯特錯的,這兩個方法完全不一樣,我們舉個例子

假設我們在調用main方法中調用一個run方法,你可能以為這樣和使用start方法是一樣的,其實不然,我們在run方法之前加上一個死循環,讓run方法一直無法執行.而start方法卻可以執行,因為start方法是重新創建了一個新的線程,不是在main線程中國運行的,所以不會受main線程中的死循環的干擾..

5.終止一個線程

package Thread;public class ThreadDemo12 {private static boolean isQuit = false;public static void main(String[] args) throws InterruptedException {Thread t = new Thread(()->{while(!isQuit){System.out.println("我是一個線程,工作中");try {Thread.sleep(1000);} catch (InterruptedException e) {throw new RuntimeException(e);}}System.out.println("線程工作完畢");});t.start();Thread.sleep(3000);isQuit = true;System.out.println("讓t線程退出");}
}

最后結果為

這就好比這個時候我在打游戲,女朋友突然叫我去和她一起開心一下,這個時候就是main線程來中斷我這個t線程,我得配合她她才能中斷我的動作,假設我不配合,那她也沒有辦法.

所以這里的線程運行中想要中斷,其實是需要兩個線程中相互配合的,這里就使用了isQuit變量來實現其中的相互配合.

.

其實這里也有一個方法來實現對線程的中斷,我們來嘗試一下

interrupt()

isInterrupted() 判斷是否被打斷

我們不妨來試試用這個來作為標志位

package Thread;public class ThreadDemo13 {public static void main(String[] args) {Thread t = new Thread(()->{while(!Thread.currentThread().isInterrupted()) {System.out.println("我是一個線程,正在工作");try {Thread.sleep(1000);} catch (InterruptedException e) {e.printStackTrace();}}System.out.println("線程執行完畢");});t.start();try {Thread.sleep(3000);} catch (InterruptedException e) {throw new RuntimeException(e);}System.out.println("t線程退出");t.interrupt();}
}

結果是

我們發現t線程并沒有真正的執行結束,并且捕獲了一個打斷異常

結論:

sleep中的線程被打斷之后,線程并沒有直接退出,而是繼續一直輸出信息

這是因為線程在睡眠中被打斷會拋出一個異常,并將isInterrupted重新設置為false

解決方案,在收到這個打斷的異常之后,直接break跳出循環

有人會覺得還不如之前的isQuit標志位好,想在遇到這個異常信息的時候將isQuit設置為true,其實是行不通的,可以參考我上一篇文章中的變量捕獲.因為匿名內部類中調用的局部變量只能是final修飾的或是事實final的

6.線程中的join方法

join方法能夠實現線程的等待,假如在main線程中調用t.join,此時main線程就會等待t線程執行結束后再繼續工作,t線程執行的時候,此線程屬于阻塞狀態

下面舉個例子說明一下

package Thread;public class ThreadDemo14 {public static void main(String[] args) throws InterruptedException {Thread t1 = new Thread(()->{for (int i = 0; i < 5; i++) {System.out.println("馬上到...");try {Thread.sleep(1000);} catch (InterruptedException e) {throw new RuntimeException(e);}}System.out.println("終于到了!!!");});t1.start();t1.join();System.out.println("我等你好久了~~~");}}

執行結果如下

注:start方法一定在join方法之前調用

此時main線程等待了t1線程執行完了才開始執行

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

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

相關文章

JS文字操作庫(親測可用)

使用 <template><div class"app"><li class"main_right-btn" click"selectionColor(yellow)">題干標識</li><li class"main_right-btn" click"selectionColor(transparent)">取消標識</li…

K-means算法

K-means算法 Lloyd k-means Algorithm 樣本矩陣&#xff1a; X [ x 1 , x 2 , . . . , x n ] ∈ R d n X[x_1,x_2,...,x_n] ∈R^{dn} X[x1?,x2?,...,xn?]∈Rdn&#xff0c;有n個 x i x_i xi?每個 x i x_i xi?是d維 簇集合&#xff1a; C [ C 1 , C 2 , . . . , C c …

自由飛翔之小鳥

一、創建文件、包、類、插入圖片文件 二、app包 1、Gameapp類&#xff08;運行游戲&#xff09; package app;import main.GameFrame;public class Gameapp {public static void main(String[] args) {//游戲的入口new GameFrame();} } 三、main包 1、Barrier&#xff08;障…

【實驗】配置用戶自動獲取IPv6地址的案例

【贈送】IT技術視頻教程&#xff0c;白拿不謝&#xff01;思科、華為、紅帽、數據庫、云計算等等?編輯https://xmws-it.blog.csdn.net/article/details/117297837?spm1001.2014.3001.5502https://xmws-it.blog.csdn.net/article/details/117297837?spm1001.2014.3001.5502【…

Pyqt5 設置保存上一次結果(配置文件)

效果 每次打開Pyqt5打包后的程序&#xff0c;默認顯示的是上一次的結果 例如下圖的 文件路徑、表名、類型等 大致的思路 Pyqt5自帶的方法QSettings實現保存上一次的設置&#xff0c;其思路是讀取ini文件&#xff0c;如果不存在就是程序的初始狀態&#xff0c;如果存在則可以讀取…

C++程序中dump文件生成方法詳解

最近項目中新作成了一個動態鏈接庫&#xff0c;長時間運行后&#xff0c;偶爾會崩潰。根據log分析&#xff0c;被調用的動態庫函數最外層catch到了這個異常&#xff0c;但是不能定位哪里出了問題。另外雖然上層exe是有dump文件輸出處理的&#xff0c;但是在C中&#xff0c;如果…

如何利用Python進行數據歸一化?

1. 知識簡介 數據歸一化是數據預處理的一項重要步驟&#xff0c;它對于提高模型性能、加速模型訓練、避免數值計算問題以及提高模型的泛化能力都具有重要作用。進行數據歸一化可以起到以下作用&#xff1a;消除量綱影響&#xff0c;加速模型收斂&#xff0c;提高模型性能&…

硅谷大寬服務器:引領互聯網新時代的核心技術

在當今這個信息爆炸的時代&#xff0c;數據已經成為了企業和個人的重要資產。服務器作為數據的存儲和處理中心&#xff0c;其重要性不言而喻。硅谷大寬服務器以其卓越的性能、穩定的運行和優質的服務&#xff0c;贏得了全球眾多企業和個人的信賴和選擇。 硅谷大寬服務器的特點…

圖解分庫分表

中大型項目中&#xff0c;一旦遇到數據量比較大&#xff0c;小伙伴應該都知道就應該對數據進行拆分了。有垂直和水平兩種。 垂直拆分比較簡單&#xff0c;也就是本來一個數據庫&#xff0c;數據量大之后&#xff0c;從業務角度進行拆分多個庫。如下圖&#xff0c;獨立的拆分出…

Redisson分布式鎖實現原理

Redisson主要解決一下問題 重入問題&#xff1a;重入問題是指 獲得鎖的線程可以再次進入到相同的鎖的代碼塊中&#xff0c;可重入鎖的意義在于防止死鎖&#xff0c;比如HashTable這樣的代碼中&#xff0c;他的方法都是使用synchronized修飾的&#xff0c;假如他在一個方法內&a…

解決Spring Boot應用在Kubernetes上健康檢查接口返回OUT_OF_SERVICE的問題

現象 在將Spring Boot應用部署到Kubernetes上時&#xff0c;健康檢查接口/healthcheck返回的狀態為{"status":"OUT_OF_SERVICE","groups":["liveness","readiness"]}&#xff0c;而期望的是返回正常的健康狀態。值得注意的…

VTK物體表面畫貼合線條

1、自由畫線 2、曲線擬合畫線 3、三點閉合曲線

Docker Compose部署微服務項目實戰講解

一、Docker Compose簡介 當需要在多個容器之間協調和管理應用程序時&#xff0c;Docker Compose是一個非常有用的工具。它允許通過一個配置文件來定義、配置和啟動多個 Docker 容器&#xff0c;使得整個應用程序的部署變得更加簡單和一致。以下是 Docker Compose 的一些重要概…

Linux使用寶塔面板+Discuz+cpolar內網穿透工具搭建可公網訪問論壇

Linux寶塔面板搭建Discuz論壇&#xff0c; 并內網穿透實現公網訪問 文章目錄 Linux寶塔面板搭建Discuz論壇&#xff0c; 并內網穿透實現公網訪問前言1.安裝基礎環境2.一鍵部署Discuz3.安裝cpolar工具4.配置域名訪問Discuz5.固定域名公網地址6.配置Discuz論壇 前言 Crossday Di…

【 圖片加載】Vue前端各種圖片引用

文章目錄 一、圖片作為js常量&#xff08;常作為配置項的值 &#xff09;1、在線鏈接2、本地圖片 二、圖片img標簽1、一般的src2、動態的src用require3、src可以接收二進制文件blob&#xff08;如后端返回的、a-upload傳的圖片) 三、背景圖片 一、圖片作為js常量&#xff08;常…

8款那些年救過我的數據文件恢復軟件 - 誤刪除重要文件的“后悔藥”

無論您在保存備份方面多么小心&#xff0c;災難有時還是會發生。有時您的備份軟件無法按預期運行。 如果您的外部驅動器靠近您的設備&#xff0c;發生火災/洪水/故障時&#xff0c;有時備份會與原始文件一起丟失。即使是云存儲也不能避免故障。 還有一個事實是&#xff0c;我…

C++設計模式之工廠模式(上)——簡單工廠模式

工廠模式 概述簡單工廠模式介紹示例示例使用運行結果缺點 概述 工廠模式屬于一種創建型設計模式。其可以分為簡單工廠模式&#xff0c;工廠模式和抽象工廠模式。工廠模式分為上、中、下三篇&#xff0c;本篇主要介紹簡單工廠模式。 簡單工廠模式 介紹 簡單工廠模式可以理解…

二叉樹題目:具有所有最深結點的最小子樹

文章目錄 題目標題和出處難度題目描述要求示例數據范圍 解法一思路和算法代碼復雜度分析 解法二思路和算法代碼復雜度分析 題目 標題和出處 標題&#xff1a;具有所有最深結點的最小子樹 出處&#xff1a;865. 具有所有最深結點的最小子樹 難度 5 級 題目描述 要求 給定…

HCIP-六、OSPF-2 綜合實驗

六、OSPF-2 綜合實驗 實驗拓撲實驗需求及解法1.設備名稱和部分IP地址已配置2.所有設備運行OSPF&#xff0c;進程號為13.區域間路由匯總4.外部路由匯總5.下發默認路由6. 虛鏈路 實驗拓撲 實驗需求及解法 本實驗模擬OSPF綜合型網絡&#xff0c;按照以下需求完成實驗。 1.設備名…