【JAVAEE】多線程

【JAVAEE】多線程

  • 一、進程
      • 1.1 進程的定義
      • 1.2 進程和線程的聯系
  • 二、線程
      • 2.1 JConsole工具
      • 2.2 創建線程
        • 2.2.1 Thread類,start(),run()
        • 2.2.2 繼承Thread類
        • 2.2.3 實現Runnable接口
        • 2.2.4 匿名內部類
        • 2.2.5 使用Runnable接口的匿名內部類
        • 2.2.6 使用lambda表達式
      • 2.3 Thread類及常用方法
        • 2.3.1 Thread類的構造方法
        • 2.3.2 Thread類的常見屬性
      • 2.4 線程狀態
      • 2.5 后臺線程和前臺線程
      • 2.6 休眠線程
      • 2.7 線程等待
      • 2.8 終止線程
        • 2.8.1 自定義標志位終止線程
        • 2.8.2 使用自帶標志位終止線程

博客結尾包含此篇博客的全部代碼!!!

一、進程

1.1 進程的定義

  • 進程(Process)是計算機操作系統中的一個核心概念,它是程序在計算機上的一次動態執行實例。換句話說,進程是程序運行時的活動表現形式。它包含了程序代碼、數據、運行狀態以及系統資源的分配情況。進程相當于一個正在運行的程序
  • 進程也是系統分配資源的基本單位

在這里插入圖片描述

1.2 進程和線程的聯系

首先,并發編程成為我們的需求!每個客戶端給服務器發送請求,服務器就需要給客戶端提供服務。在90年代,多進程是一種解決方案!!!

那么既然有解決方法,為什么還要引入線程?
線程:線程是輕量級的進程!!!

線程相比于進程:

  • 創建線程比創建進程更快。
  • 銷毀線程比銷毀進程更快。
  • 調度線程比調度進程更快。

舉個例子:

假設這個任務是“消滅”桌子上的兩只雞,在一個房間中有一個桌子,桌子上放了兩只雞。
進程的解決方法:再創建一個房間,將這兩只雞分開,分別“消滅”。
在這里插入圖片描述
線程的解決方法:在這個房間中“消滅”這兩只雞。
在這里插入圖片描述
這兩個對比你發現:相同的人數,進程需要再創建一個房間(開銷很大),而線程則啥都不需要添加。

二、線程

2.1 JConsole工具

在創建線程之前,先給大家介紹一下JConsole 工具, JConsole是JDK 自帶的一款圖形化監控和管理工具,基于 JMX(Java Management Extensions)技術實現。它能夠連接到本地或遠程的 Java 虛擬機(JVM),并實時監控和管理 Java 應用程序的性能和資源使用情況。
這里我們就用它來監控我們的線程!
JConsole:找到我們的JDK安裝的安裝路徑,像我這里安裝的JDK17–>bin–>jconsole.exe
在這里插入圖片描述
如何使用?
測試代碼:代碼運行起來才能觀察到,如果線程結束就觀察不到。

class MyThread extends Thread {@Overridepublic void run() {while (true) {System.out.println(" hello Thread");}}
}public class Demo1 {public static void main(String[] args) {MyThread t1 = new MyThread();t1.start();}
}

在這里插入圖片描述

在這里插入圖片描述
剛進去出現不安全連接,由于是我是自己練習,所以點不安全連接。
在這里插入圖片描述

2.2 創建線程

2.2.1 Thread類,start(),run()
  • Thread類:線程,是操作系統的概念,操作系統定義了一些api(應用程序編程接口)來供程序員使用,而java中將這些api封裝成Thread類來供使用!Thread類在java.long這個包中,所以用的時候不需要導包。
  • start():用于啟動一個新線程,線程調度器會調用 run() 方法。start() 方法只能被調用一次。如果嘗試多次調用 start(),會拋出 IllegalThreadStateException 異常。
  • run():定義線程的執行邏輯,但不會啟動新線程。如果需要啟動新線程,必須通過 start() 方法。相當于線程的入口。
2.2.2 繼承Thread類

代碼:

class MyThread extends Thread {@Overridepublic void run() {while (true) {System.out.println(" hello Thread");}}
}public class Demo1 {public static void main(String[] args) {MyThread t1 = new MyThread();t1.start();while(true) {System.out.println(" hello main");}}
}
2.2.3 實現Runnable接口

實現Runnable接口的MyRunnnable類,將new MyRunnable()當作一個對象傳給Thread的構造函數。
代碼:

class MyRunnable implements Runnable {@Overridepublic void run() {System.out.println("Hello Thread");}
}public class Demo2 {public static void main(String[] args) {Thread t1 = new Thread(new MyRunnable());t1.start();}
}
2.2.4 匿名內部類
public class Demo3 {public static void main(String[] args) {Thread thread = new Thread(){@Overridepublic void run() {System.out.println("Hello Thread");}};thread.start();System.out.println("Hello main");}
}
2.2.5 使用Runnable接口的匿名內部類
public class Demo4 {public static void main(String[] args) {Thread t1 = new Thread(new Runnable(){@Overridepublic void run() {System.out.println("Hello Thread");}});t1.start();}
}
2.2.6 使用lambda表達式
public class Demo5 {public static void main(String[] args) {Thread thread = new Thread(()->{while(true){System.out.println("Hello Thread");}});thread.start();while(true){System.out.println("Hello main");}}
}

2.3 Thread類及常用方法

2.3.1 Thread類的構造方法

在這里插入圖片描述
解釋一下第四個Thread(Runnable target,String name)!


public class Demo6 {public static void main(String[] args) {Thread thread = new Thread(new Runnable() {@Overridepublic void run() {while (true) {System.out.println("Hello Thread");}}}, "Thread1");thread.start();while (true) {System.out.println("Hello main");}}
}

在這里插入圖片描述

在這里插入圖片描述

2.3.2 Thread類的常見屬性

在這里插入圖片描述
? ID 是線程的唯?標識,不同線程不會重復
? 獲取線程的名稱
? 獲取線程的當前狀態,如新建、就緒、運行、阻塞、等待、終止等
? 優先級?的線程理論上來說更容易被調度到
? 關于后臺線程,需要記住?點:JVM會在?個進程的所有?后臺線程結束后,才會結束運?。
? 是否存活,即簡單的理解,為 run ?法是否運?結束了
? 判斷線程是否被中斷。線程的中斷狀態可以通過調用 interrupt() 方法來設置,該方法會改變線程的中斷狀態,但不會停止線程的執行

2.4 線程狀態

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

獲取線程的所有狀態:
在這里插入圖片描述
? NEW:

  • 當線程對象被創建,但尚未調用 start() 方法時,線程處于新建狀態。
  • 在這個狀態下,線程尚未開始執行。
public class Demo7 {public static void main(String[] args) {Thread thread=new Thread(()->{System.out.println("Hello Thread");});System.out.println(thread.getState());thread.start();}
}

? RUNNABLE:

  • 當調用線程的 start() 方法后,線程進入就緒狀態。
  • 在這個狀態下,線程已經準備好運行,等待 CPU 時間片以便執行。
  • 就緒狀態的線程可能正在 JVM 中運行,也可能正在等待操作系統調度。
public class Demo7 {public static void main(String[] args) throws InterruptedException {Thread thread=new Thread(()->{for(int i=0;i<3;i++) {System.out.println("Hello Thread");}});System.out.println(thread.getState());thread.start();System.out.println(thread.getState());}
}

? BLOCKED: 由鎖導致的,后面會出一篇關于線程安全問題,到時候會詳細介紹,這里就不過多介紹了

  • 當線程等待獲取一個排他鎖,如同步塊或同步方法中的鎖時,線程進入阻塞狀態。
  • 線程在等待鎖釋放后才能繼續執行。
  • 阻塞狀態的線程不會被分配 CPU 時間片。

? WAITING:
時間阻塞(這個等待是沒時間上限的)

  • 當線程執行 wait()、join() 或 LockSupport.park() 方法后,線程進入等待狀態。
  • 在這個狀態下,線程需要等待其他線程執行特定的操作(如通知或中斷)才能繼續。
  • 等待狀態的線程不會被分配 CPU 時間片。
public class Demo7 {public static void main(String[] args) throws InterruptedException {Thread thread=new Thread(()->{while(true) {}});System.out.println(thread.getState());thread.start();thread.join();}
}

在這里插入圖片描述
發現main線程是waiting。

? TIMED_WAITING:
時間阻塞(這個等待是有時間上限的),不參與CPU調度

public class Demo7 {public static void main(String[] args) throws InterruptedException {Thread thread=new Thread(()->{while(true) {try {Thread.sleep(2000);} catch (InterruptedException e) {throw new RuntimeException(e);}}});System.out.println(thread.getState());thread.start();Thread.sleep(1000);System.out.println(thread.getState());}
}

? TERMINATED:

  • 當線程的 run() 方法執行完畢,或者線程被 stop() 方法(已廢棄)強制停止,或者線程拋出未捕獲的異常導致運行結束時,線程進入終止狀態。
  • 在這個狀態下,線程已經結束執行,不再消耗任何資源。
public class Demo7 {public static void main(String[] args) throws InterruptedException {Thread thread=new Thread(()->{for(int i=0;i<3;i++) {System.out.println("Hello Thread");}});System.out.println(thread.getState());thread.start();Thread.sleep(6000);System.out.println(thread.getState());}
}

2.5 后臺線程和前臺線程

前臺線程:一般我們創建的線程都是前臺線程,只要前臺線程不結束,JVM就不會退出。
后臺線程:也稱守護線程,后臺線程一般都是輔助性的任務,如果前臺線程全部結束,即使還有后臺線程在運行,JAM也會退出。

public class Demo8 {public static void main(String[] args) {Thread thread1=new Thread(()->{for(int i=0;i<2;i++){System.out.println("Hello Thread");}});thread1.start();System.out.println(thread1.isDaemon());//false 說明他不是守護線程Thread thread2=new Thread(()->{for(int i=0;i<2;i++){System.out.println("Hello Thread");}});thread2.setDaemon(true);thread2.start();System.out.println(thread2.isDaemon());//true}
}

2.6 休眠線程

在這里插入圖片描述
下面那個可以達到納秒級別,這種適用于軍工,航天等之類,一把情況下用不到。
在這里插入圖片描述
這里還有一個需要注意的是:由于 Runnable 接口的 run 方法沒有 throws 子句,所以這里只能用try-catch 來捕獲異常。

2.7 線程等待

在這里插入圖片描述

public class Demo10 {public static void main(String[] args) throws InterruptedException {Thread thread = new Thread(()->{for (int i = 0; i < 3; i++){System.out.println("Hello Thread");}});thread.start();thread.join();System.out.println("Hello main");}
}

先執行thread線程,thread線程執行完,再執行main線程。為了防止死等,也可以設置等待時間。

2.8 終止線程

讓run方法盡快結束。

2.8.1 自定義標志位終止線程
public class Demo11 {public static  boolean flag=true;public static void main(String[] args) throws InterruptedException {Thread thread = new Thread(()->{while(flag){System.out.println("Hello Thread");}System.out.println("Bye Bye Thread");});thread.start();Thread.sleep(1000);flag=false;}
}

將flag設置為全局變量,這里就是匿名內部類訪問外部類,而不是變量捕獲。
為什么不可以將flag設置為局部變量?
在這里插入圖片描述

很有可能是main線程已經執行完,已經將flag銷毀了,但是Thread線程中還沒執行到while(flag)…

2.8.2 使用自帶標志位終止線程

在這里插入圖片描述
Java自帶標志位來結束終止線程。先使用Thread.currentThread()來獲取當前線程,在.isInterrupted()獲取標志位。然后再主進程中調用interrupte()方法來將標志位值修改為true。

public class Demo12 {public static void main(String[] args) throws InterruptedException {Thread thread = new Thread(() -> {while (!Thread.currentThread().interrupted()) {System.out.println("Hello Thread");}System.out.println("Bye Bye Thread");});thread.start();Thread.sleep(1000);thread.interrupt();}
}

調用interrupte()方法,不僅會設置標志位,還會提前喚起sleep阻塞

public class Demo12 {public static void main(String[] args) throws InterruptedException {Thread thread = new Thread(() ->{while (!Thread.currentThread().isInterrupted()) {System.out.println("hahah");try {Thread.sleep(1000);} catch (InterruptedException e) {//1.不操作繼續執行線程(因為sleep喚醒后會又將標志位改為true)e.printStackTrace();//2.結束線程break;//3.進行其它操作}}});thread.start();Thread.sleep(1000);thread.interrupt();}
}

此篇博客的全部代碼!!!

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

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

相關文章

手機打電話時如何識別對方按下的DTMF按鍵的字符-安卓AI電話機器人

手機打電話時如何識別對方按下的DTMF按鍵的字符 --安卓AI電話機器人 一、前言 前面的篇章中&#xff0c;使用藍牙電話攔截手機通話的聲音&#xff0c;并對數據加工&#xff0c;這個功能出來也有一段時間了。前段時間有試用的用戶咨詢說&#xff1a;有沒有辦法在手機上&#xff…

【Go】十八、http 調用服務的編寫

http接口框架的搭建 這個http接口框架的搭建參考之前的全量搭建&#xff0c;這里是快速搭建的模式&#xff1a; 直接對已有的http模塊進行復制修改&#xff0c;主要修改點在于 proto部分與api、router 部分&#xff0c;剩余的要針對進行修改模塊名稱。 接口的具體編寫 在 a…

WiseFlow本地搭建實錄---保姆教程

今天從零開始搭建了Wiseflow的本地環境搭建&#xff0c;目前使用的都是免費的API&#xff0c;我建議大家可以一起嘗試一下搭建自己的關鍵信息的數據庫&#xff0c;我是windows的環境&#xff0c;但是其他的應該也差不多&#xff0c;踩了很多坑&#xff0c;希望這篇文章能幫大家…

數的計算(藍橋云課)

題目描述 輸入一個自然數 n (n≤1000)n (n≤1000)&#xff0c;我們對此自然數按照如下方法進行處理: 不作任何處理; 在它的左邊加上一個自然數,但該自然數不能超過原數的一半; 加上數后,繼續按此規則進行處理,直到不能再加自然數為止。 問總共可以產生多少個數。 輸入描述 輸…

知識庫功能測試難點

圖表交互功能測試難點 知識庫圖表類型多&#xff0c;每種圖表交互功能不同。像柱狀圖&#xff0c;可能有點擊柱子查看詳細數據、鼠標懸停顯示數據提示等交互&#xff1b;折線圖除了這些&#xff0c;還可能支持縮放查看不同時間段數據。多種交互操作在不同圖表間存在差異&#x…

【人工智能】數據挖掘與應用題庫(201-300)

1、在LetNet5網絡中,卷積核的大小是? 答案:5*5 2、LeNet5網絡參數的數量約為? 答案:6萬 3、AlexNet與LeNet5相比,使用了哪些機制來改進模型的訓練過程? 答案: 數據增廣Dropout抑制過擬合ReLU激活函數CUDA加速神經網絡訓練4、VGGNet使用的卷積核的大小是? 答案:…

web安全滲透測試 APP安全滲透漏洞測試詳情

前言 小小白承包了一塊20畝的土地&#xff0c;依山傍水&#xff0c;風水不錯。聽朋友說去年玉米大賣&#xff0c;他也想嘗嘗甜頭&#xff0c;也就種上了玉米。 看著玉米茁壯成長&#xff0c;別提小小白心里多開心&#xff0c;心里盤算著玉米大買后&#xff0c;吃香喝辣的富貴…

CSS處理內容溢出

<!DOCTYPE html> <html lang"zh-cn"><head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>處理內容溢出</title><style>#d1{wid…

拉丁超立方采樣(Latin Hypercube Sampling)技術詳解及實現

拉丁超立方采樣(Latin Hypercube Sampling)技術詳解 拉丁超立方采樣(Latin Hypercube Sampling)技術詳解1. 引言2. 拉丁超立方采樣原理3. 數學公式描述4. Python代碼實現代碼解析5. 應用場景與優勢6. 在化工中的應用6.1 工藝參數優化6.2 不確定性量化與風險評估6.3 實驗設計…

docker-compose部署onlyoffice8.3.0并支持ssl,且支持通過nginx代理,關閉JWT配置

編寫docker-compose文件 mkdir -p /data/onlyoffice && echo "version: 3services:onlyoffice:container_name: OnlyOfficeimage: onlyoffice/documentserver:8.3.0restart: alwaysports:- 8088:80- 64431:443environment:TZ: Asia/ShanghaiJWT_ENABLED: falsevol…

Sliding Window Attention(滑動窗口注意力)解析: Pytorch實現并結合全局注意力(Global Attention )

Sliding Window Attention&#xff08;滑動窗口注意力&#xff09;解析 Sliding Window Attention&#xff08;滑動窗口注意力&#xff09; 是 Longformer (來源&#xff1a;https://arxiv.org/pdf/2004.05150)提出的 稀疏注意力機制&#xff0c;旨在解決 標準 Transformer 計算…

【運維】內網服務器借助通過某臺可上外網的服務器實現公網訪問

背景&#xff1a; 內網服務器無法連接公網,但是辦公電腦可以連接內網服務器又可以連接公網。 安裝軟件 1、frp 2、ccproxy 配置 1、內網服務器 # 內網服務器啟動frp服務配置文件參考vi frps.ini# frps.ini [common] bind_port 7000# 備注: bind_port端口可以隨意配置。配置完…

flask 是如何分發請求的?

這篇博客會涉及一些 WSGI 的知識&#xff0c;不了解的可以看這篇博客&#xff0c;簡單了解一下。 Python 的 WSGI 簡單入門 一、請求在 flask 中的處理過程 我們先來看一下 werkzeug.routing 包下 Map 和 Rule 方法的使用&#xff0c;這里給出一個官方的示例&#xff08;我進…

怎么獲取免費的 GPU 資源完成大語言模型(LLM)實驗

怎么獲取免費的 GPU 資源完成大語言模型(LLM)實驗 目錄 怎么獲取免費的 GPU 資源完成大語言模型(LLM)實驗在線平臺類Google ColabKaggle NotebooksHugging Face Spaces百度飛槳 AI Studio在線平臺類 Google Colab 特點:由 Google 提供的基于云端的 Jupyter 筆記本環境,提…

Python開發Django面試題及參考答案

目錄 Django 的請求生命周期是怎樣的? Django 的 MTV 架構中的各個組件分別是什么? Django 的 URL 路由是如何工作的? Django 的視圖函數和視圖類有什么區別? Django 的模板系統是如何渲染 HTML 的? Django 的 ORM 是如何工作的? Django 的中間件是什么?它的作用是…

【圖像的讀寫與基本操作】

圖像的讀寫與基本操作 目錄 圖像的讀寫與基本操作目標知識點1. 圖像的讀寫 &#xff1a;2. 圖像的縮放 &#xff1a;3. 圖像的翻轉 &#xff1a;4. 圖像的裁剪 &#xff1a;5. 顏色空間轉換 &#xff1a; 示例代碼1. 圖像的讀寫 &#xff1a;2. 圖像的縮放 &#xff1a;3. 圖像…

《數字圖像處理》筆記

文章目錄 第一章 緒論1.1 什么是數字圖像處理數字圖像的概念數字圖像的組成數字圖像處理的概念 1.4 數字圖像處理的基本步驟 第二章 數字圖像基礎2.2 光和電磁波譜可見光單色光灰度級發光強度光通量亮度 2.3 圖像感知和獲取將照射能量變換為數字圖像的傳感器簡單的圖像形成模型…

網絡安全掃描--基礎篇

前言 1、了解互聯網安全領域中日趨重要的掃描技術 2、了解在不同網絡場景下掃描技術手段 3、熟悉linux下系統內核防護策略并能大件一個有效的系統防護體系 4、增強工作安全意識&#xff0c;并能有效的實踐于工作場景中 目錄 1、熟悉主機掃描工具&#xff08;fping&#xff0c;…

前端防重復請求終極方案:從Loading地獄到精準攔截的架構升級

&#x1f525; 事故現場還原&#xff1a;瘋狂點擊引發的血案 凌晨1點23分&#xff0c;監控系統突然告警&#xff1a; &#x1f4c9; 服務器CPU飆升至98% &#x1f5c3;? 數據庫出現3000臟數據 &#x1f4a5; 用戶端彈出上百個錯誤彈窗 事故原因&#xff1a;黑產腳本通過0.5秒…

基于Spring Boot的供應商管理系統設計與實現(LW+源碼+講解)

專注于大學生項目實戰開發,講解,畢業答疑輔導&#xff0c;歡迎高校老師/同行前輩交流合作?。 技術范圍&#xff1a;SpringBoot、Vue、SSM、HLMT、小程序、Jsp、PHP、Nodejs、Python、爬蟲、數據可視化、安卓app、大數據、物聯網、機器學習等設計與開發。 主要內容&#xff1a;…