認識線程和創建線程

目錄

1.認識多線程

1.1線程的概念

1.2進程和線程

1.2.1進程和線程用圖描述關系

?1.2.2進程和線程的區別

1.3Java 的線程和操作系統線程的關系?

?2.創建線程

2.1繼承 Thread 類

?2.2實現 Runnable 接口

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

2.4匿名內部類創建 Runnable 子類對象

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


1.認識多線程

1.1線程的概念

引入線程:進程雖然可以很好的實現并發編程,但在進行頻繁的進程創建和銷毀的過程中開銷比較大(體現在資源的申請和釋放上)。所以就發明了比進程更輕量的線程。

線程與進程相比:

(1)創建線程比創建進程更快 .
(2)銷毀線程比銷毀進程更快 .
(3)調度線程比調度進程更快 .
線程具體是什么?
? 一個線程就是一個 " 執行流 ". 每個線程之間都可以按照順訊執行自己的代碼 . 多個線程之間 " 同時 " 執行 著多份代碼.

1.2進程和線程

1.2.1進程和線程用圖描述關系
1.進程是包含線程的 . 每個進程至少有一個線程存在,即主線程。
2.進程和進程之間不共享內存空間 . 同一個進程的線程之間共享同一個內存空間 .
?1.2.2進程和線程的區別

(高頻面試題)

1.進程是包含線程的。

2.每個線程就是一個?獨立的"執行流",可以單獨執行一些代碼,并參與到CPU的調度(狀態,上下文,優先級,記賬信息,每個線程都有自己的一份)

3.每個進程都有自己的資源,進程中的線程共用一份資源(內存空間和文件描述符表)

(2)與(3)說明:

進程是系統分配資源的最小單位,線程是系統調度的最小單位。

4.進程與進程之間不會相會影響,但?線程與線程之間會相會影響。如果一個進程中的某個線程拋出異常,可能會導致進程中的所有線程都異常終止。

1.3Java 的線程和操作系統線程的關系?

1.線程是操作系統中的概念 . 操作系統內核實現了線程這樣的機制 , 并且對用戶層提供了一些 API 供用戶使用(例如 Linux pthread ).
2. Java 標準庫中 Thread 類可以視為是對操作系統提供的 API 進行了進一步的抽象和封裝 .

注意:

(1)線程與線程之間可能會相互干擾,產生邏輯bug,引起線程安全。

(2)線程不是越多越好,線程太多調度開銷可能會非常明顯。


?

?2.創建線程

2.1繼承 Thread

(1)繼承 Thread 來創建一個線程類

class MyThread extends Thread {
?? ?@Override
?? ?public void run() {
?? ??? ?System.out.println("這里是線程運行的代碼");
?? ?}
}

此處?run()不需要手動調動,在線程創建好之后JVM會自動調用執行(回調函數)。

(2)創建 MyThread 類的實例

MyThread t = new MyThread();

創建出的實例才是真線程。?

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

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

此時才會真正調用系統API,在系統內核中創建出線程(執行run())。

?為啥要在系統內核中創建出線程?

因為程序有時需要對軟硬件資源進行操作。

完整示例:

public class ThreadDemo1 {public static void main(String[] args) {Thread t = new MyThread();t.start();while(true){System.out.println("main");try {Thread.sleep(1000);} catch (InterruptedException e) {throw new RuntimeException(e);}}}
}class MyThread extends Thread{@Overridepublic void run() {while(true){System.out.println("MyThread");try {Thread.sleep(1000);} catch (InterruptedException e) {throw new RuntimeException(e);}}}
}

?進程創建第一個線程時開銷最大,之后的線程開銷都比較小,但不是0,main線程其實是第一個線程。

?

一直循環……?

?當有多個線程,它們的執行順序是不確定的。


?使用 jconsole 命令觀察線程

我們可以使用jdk自帶的工具 jconsole查看當前Java進程中所有的線程

第一步,找到jdk

第二步,點進去,找到里面的bin文件點進去

第三步,在bin文件夾里搜索jconsole?

第四步,找到你所創建進程點擊線程進行查看

?


?2.2實現 Runnable 接口

(1) 實現 Runnable 接口

class MyRunnable implements Runnable {
@Override
public void run () {
System . out . println ( " 這里是線程運行的代碼 " );
? }
}

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

Thread t = new Thread(new MyRunnable());

(3) 調用 start 方法

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

?完整示例:

public class ThreadDemo2 {public static void main(String[] args) {Thread t = new Thread(new MyRunnable());t.start();while(true){System.out.println("main");try {Thread.sleep(1000);} catch (InterruptedException e) {throw new RuntimeException(e);}}}
}class MyRunnable implements Runnable{@Overridepublic void run() {while(true){System.out.println("MyRunnable");try {Thread.sleep(1000);} catch (InterruptedException e) {throw new RuntimeException(e);}}}
}
這種寫法其實就是把線程和要執行的任務進行了解耦合。
對比上面兩種方法 :
1.繼承 Thread , 直接使用 this 就表示當前線程對象的引用 .
2.實現 Runnable 接口 , this 表示的是 MyRunnable 的引用 . 需要使用 Thread.currentThread()

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

// 使用匿名類創建 Thread 子類對象
Thread t1 = new Thread () {
@Override
public void run () {
System . out . println ( " 使用匿名類創建 Thread 子類對象 " );
? }
};

??完整示例:

public class ThreadDemo3 {public static void main(String[] args) {Thread t=new Thread(){@Overridepublic void run() {while (true){System.out.println("使用匿名類創建 Thread 子類對象");try {Thread.sleep(1000);} catch (InterruptedException e) {throw new RuntimeException(e);}}}};t.start();while(true){System.out.println("main");try {Thread.sleep(1000);} catch (InterruptedException e) {throw new RuntimeException(e);}}}
}

2.4匿名內部類創建 Runnable 子類對象

// 使用匿名類創建 Runnable 子類對象
Thread t2 = new Thread ( new Runnable () {
@Override
public void run () {
System . out . println ( " 使用匿名類創建 Runnable 子類對象 " );
? }
});

??完整示例:

public class ThreadDemo4 {public static void main(String[] args) {Thread t=new Thread(new Runnable() {@Overridepublic void run() {while(true){System.out.println("使用匿名類創建Runnable子類對象");try {Thread.sleep(1000);} catch (InterruptedException e) {throw new RuntimeException(e);}}}});t.start();while(true){System.out.println("main");try {Thread.sleep(1000);} catch (InterruptedException e) {throw new RuntimeException(e);}}}
}

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

?lambda就是讓方法看上去脫離類,單獨存在。

// 使用 lambda 表達式創建 Runnable 子類對象
Thread t3 = new Thread (() -> System . out . println ( " 使用匿名類創建 Thread 子類對象 " ));
Thread t4 = new Thread (() -> {
System . out . println ( " 使用匿名類創建 Thread 子類對象 " );
});

??完整示例:

  public static void main(String[] args) {Thread t=new Thread(() -> {while(true){System.out.println("使用匿名類創建Runnable子類對象");try {Thread.sleep(1000);} catch (InterruptedException e) {throw new RuntimeException(e);}}});t.start();while(true){System.out.println("main");try {Thread.sleep(1000);} catch (InterruptedException e) {throw new RuntimeException(e);}}}
}

都看到這了,不如關注一下,給個免費的贊?

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

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

相關文章

使用貝葉斯網絡檢測因果關系,提升模型效果更科學(附Python代碼)

雖然機器學習技術可以實現良好的性能,但提取與目標變量的因果關系并不直觀。換句話說,就是:哪些變量對目標變量有直接的因果影響? 機器學習的一個分支是貝葉斯概率圖模型(Bayesian probabilistic graphical models),也…

【Com通信】Com模塊詳細介紹

目錄 前言 1. Com模塊功能介紹 2.關鍵概念理解 3.功能詳細設計 3.1 Introduction 3.2 General Functionality 3.2.1 AUTOSAR COM basis 3.2.2 Signal Values 3.2.3 Endianness Conversion and Sign Extension 3.2.4 Filtering 3.2.5 Signal Gateway 3.3 Normal Ope…

2.2 網絡多線程(私聊、群發、發送文件、推送新聞、離線留言)

文章目錄 一、私聊1.1 分析1.2 客戶端1.2.1 MessageClientService 私聊類1.2.2 ClientConnectServerThread 線程類 1.3 服務端1.3.1 ServerConnectClientThread 線程類 1.4功能演示 二、群發消息2.1 分析2.2 客戶端2.2.1 MessageClientService類2.2.2 ClientConnectServerThrea…

1.1.1.多線程的發展--對cpu性能的壓榨史

一.壓榨歷史 1.單進程人工切換。紙帶機。只能解決簡單的數學問題。 2.單道批處理。多進程批處理。多個任務批量執行。解決手動操作時需要人工切換作業導致的系統利用率低的問題 3.多進程并行處理。把程序寫在不同的內存位置來回切換。當一個作業在等待I/O處理時,…

C語言-函數STRCPY

strcpy char *strcpy(char *restrict dst, const char *restrict src);把src的字符串拷貝到dst restrict表明src和dst不重疊(C99) 返回dst 為了能鏈起代碼來 復制一個字符串 char dst (char)malloc(strlen(src) 1); strcpy(dst, src);

從單向鏈表中刪除指定值的節點

輸入一個單向鏈表和一個節點的值,從單向鏈表中刪除等于該值的節點,刪除后如果鏈表中無節點則返回空指針。 鏈表的值不能重復。構造過程,例如輸入一行數據為:6 2 1 2 3 2 5 1 4 5 7 2 2則第一個參數6表示輸入總共6個節點,第二個參數…

通過仿真理解完整的陣列信號噪聲模型

概要 噪聲對無線電設備的信號接收會造成影響,是通信、雷達、導航、遙感等工程應用領域中的關鍵考慮因素。通常認為陣列合成能夠提升信噪比,但忽略了這一論斷的前提,即不同通道引入的噪聲互不相關。但實際應用中,接收的噪聲不僅僅包含信道引入的不相關噪聲,還包含從外界環…

1-6、編程語言排行榜

語雀原文鏈接 https://www.tiobe.com/tiobe-index/

IntelliJ IDEA創建一個Maven項目

在IDEA中創建Maven項目,前提是已經安裝配置好Maven環境 。 本文主要使用的是IntelliJ IDEA 2022.2.1 (Community Edition) 1.創建一個新project:File>Project 2.修改Maven配置:File>Settings>搜索maven 創建好的工程如下: src/main…

使用NanoPi NEO4進行rtsp拉流

使用系統:FriendlyDesktop系統 使用python進行編程,分別使用opencv與ffmpeg進行功能實現,折騰了挺長時間,代碼很簡單,主要是環境搭建。主要是python、opencv-python、ffmpeg-python、numpy之間的版本兼容,…

Chart 8 內核優化

文章目錄 前言8.1 內核融合和拆分8.2 編譯選項8.3 Conformant(規范) vs. fast vs. native math functions8.4 Loop unrolling8.5 避免分支發散8.6 Handle image boundaries8.7 Avoid the use of size_t8.8 通用 vs. 具名內存地址空間8.9 Subgroup8.10 Us…

七個常用<python裝飾器>---足夠改進代碼質量 (保姆詳解)

前言: 寫代碼嘛,關鍵是得讓它既好用又好看,這不,Python裝飾器就擺在那兒。咱們程序員有時也得有那么點藝術家的腔調:講求效率,追求代碼的簡潔優雅,偶爾還得裝裝X,不是嗎? 翻開人家…

SpringSecurity6 | 自定義認證規則

?作者簡介:大家好,我是Leo,熱愛Java后端開發者,一個想要與大家共同進步的男人😉😉 🍎個人主頁:Leo的博客 💞當前專欄: Java從入門到精通 ?特色專欄&#xf…

移相干涉技術1-多種干涉條紋仿真模擬生成(原理轉載+代碼實現 包括模擬生成干涉條紋圖)

過去的干涉測量技術是通過人的肉眼或者相機拍攝,來直觀判斷干涉圖中條紋特征進而完成測量,該方法的不穩定因素(比如人的主觀意志)很多,其精度誤差在/10左右38];現代干涉測量技術通過將電子技術、計算機技術…

智能優化算法應用:基于廚師算法無線傳感器網絡(WSN)覆蓋優化 - 附代碼

智能優化算法應用:基于廚師算法無線傳感器網絡(WSN)覆蓋優化 - 附代碼 文章目錄 智能優化算法應用:基于廚師算法無線傳感器網絡(WSN)覆蓋優化 - 附代碼1.無線傳感網絡節點模型2.覆蓋數學模型及分析3.廚師算法4.實驗參數設定5.算法結果6.參考文獻7.MATLAB…

代碼隨想錄-刷題第二十一天

530.二叉搜索樹的最小絕對差 題目鏈接&#xff1a;530. 二叉搜索樹的最小絕對差 思路&#xff1a;二叉搜索樹的中序遍歷是有序的。根據二叉搜索樹的這個特性來解題。 class Solution {// 同樣利用二叉樹中序遍歷是一個有序數組。private List<Integer> list new Arra…

一加 12 Pop-up快閃活動來襲,十城聯動火爆開啟

12 月 9 日&#xff0c;一加 12 Pop-up 快閃活動在北京、深圳、上海、廣州等十城聯動開啟&#xff0c;各地加油歡聚快閃現場&#xff0c;搶先體驗與購買一加 12。作為一加十年超越之作&#xff0c;一加 12 全球首發擁有醫療級護眼方案和行業第一 4500nit 峰值亮度的 2K 東方屏、…

C++新經典模板與泛型編程:策略類模板

策略類模板 在前面的博文中&#xff0c;策略類SumPolicy和MinPolicy都是普通的類&#xff0c;其中包含的是一個靜態成員函數模板algorithm()&#xff0c;該函數模板包含兩個類型模板參數。其實&#xff0c;也可以把SumPolicy和MinPolicy類寫成類模板—直接把algorithm()中的兩…

【Linux】無法使用 ifconfig 查看系統網絡接口信息,報錯 command not found: ifconfig

問題描述 ifconfig是一個用于配置和顯示系統網絡接口信息的命令行工具。它通常用于Unix、Linux和其他類Unix系統中。 通過ifconfig命令&#xff0c;你可以查看和修改系統中網絡接口的配置信息&#xff0c;包括IP地址、子網掩碼、MAC地址、MTU&#xff08;最大傳輸單元&#x…

javacv踩坑記錄

前一陣學習opencv&#xff0c;發現在做人臉識別的時候遇到一些類庫不存在的情況&#xff0c;查找后發現是由于拓展包沒有安裝完全&#xff08;僅安裝了基礎版&#xff09;。由于網絡的問題&#xff08;初步猜測&#xff09;&#xff0c;始終無法安裝好拓展包。 于是另辟蹊徑&am…