重學java 38.創建線程的方式?

It is during our darkest moments that we must focus to see the light

???????????????????????????????????????????????????????????????????????????????????????????????—— 24.5.24

一、第一種方式_繼承extends Thread方法

1.定義一個類,繼承Thread
2.重寫run方法,在run方法設置線程任務(所謂的線程任務指的是此線程要干的具體的事兒,具體執行的代碼)
3.創建自定義線程類的對象
4.調用Thread中的start方法,開啟線程,jvm自動調用run方法

package S64thread;public class Demo195Mythread extends Thread{@Overridepublic void run(){for (int i = 0; i < 10; i++) {System.out.println("Mythread執行了"+i);}}
}
package S64thread;public class Demo196Test {public static void main(String[] args) {// 創建線程對象Demo195Mythread t1 = new Demo195Mythread();// 調用start方法,開啟線程,jvm自動調用run方法,只有調用start才會開啟線程,二者一同執行// t1.run();t1.start();for (int i = 0; i < 10; i++) {System.out.println("main線程執行了"+i);}}
}

二、多線程在內存中的運行原理?

????????注意:同一個線程對象不能連續調用多次start,如果想要再次調用start,那么咱們就new一個新的線程對象

三、Thread類中的方法

package S65threadMethod;public class Demo197Mythread extends Thread{@Overridepublic void run(){for (int i = 0; i < 10; i++) {System.out.println(getName()+"執行了"+i);}}
}
package S65threadMethod;public class Demo198Test {public static void main(String[] args) {// 創建線程對象Demo197Mythread t1 = new Demo197Mythread();// 給線程設置名字t1.setName("趙四");// 調用start方法,開啟線程,jvm自動調用run方法,只有調用start才會開啟線程,二者一同執行// t1.run();t1.start();for (int i = 0; i < 10; i++) {System.out.println("main線程執行了"+i);}}
}

void start() -> 開啟線程,jvm自動調用run方法

void run() -> 設置線程任務,這個run方法是Thread重寫的接口Runnable中的run方法

String getName()?-> 獲取線程名字
void setName(string name) -> 給線程設置名字
static Thread currentThread() -> 獲取正在執行的線程對象(此方法在哪個線程中使用,獲取的就是哪個線程對象

static void sleep(long millis) -> 線程睡眠超時后會自動醒來繼續執行,傳遞的是毫秒值,睡眠時不會影響其他線程,其他線程會直接運行完,不會等待

package S65threadMethod;public class Demo197Mythread extends Thread{@Overridepublic void run(){for (int i = 0; i < 10; i++) {// 線程睡眠try{// 線程sleep后一頓一頓的執行Thread.sleep(1000L);}catch (InterruptedException e){throw new RuntimeException(e);}// 鏈式調用 currentThread 獲取正在執行的線程對象System.out.println(Thread.currentThread().getName()+"線程執行了"+i);}}
}
package S65threadMethod;public class Demo198Test {public static void main(String[] args) {// 創建線程對象Demo197Mythread t1 = new Demo197Mythread();// 給線程設置名字 線程一頓一頓的執行t1.setName("趙四");// 調用start方法,開啟線程,jvm自動調用run方法,只有調用start才會開啟線程,二者一同執行// t1.run();t1.start();for (int i = 0; i < 10; i++) {// 鏈式調用System.out.println(Thread.currentThread().getName()+"線程執行了"+i);}}
}

問題:為啥在重寫的run方法有異常只能try,不能throws

原因:繼承的 Thread中的run方法 沒有拋異常,所以在子類中重寫完run方法之后就不能拋,只能try…catch

四、thread中的其他方法

1.線程優先級

? ? ? ? ① void setPriority(int newPriority) —— 設置線程優先級,優先級越高的線程,搶到CPU使用權的幾率越大,但是不是每次都先搶到

? ? ? ? ② int getPriority() —— 獲取線程優先級

package S66thread;import S65threadMethod.Demo197Mythread;public class Demo200Test {public static void main(String[] args) {// 創建兩個線程對象Demo199Mythread1 t1 = new Demo199Mythread1();t1.setName("金蓮");Demo199Mythread1 t2 = new Demo199Mythread1();t2.setName("阿慶");// 獲取兩個線程的優先級 5是一個默認優先級/*獲取兩個線程的優先級MIN_PRIORITY=1 最小優先級 1NORM_PRIORITY=5 默認優先級 5MAX_PRIORITY=10 最大優先級 10*/System.out.println(t1.getPriority());System.out.println(t2.getPriority());// 設置優先級t1.setPriority(1);t2.setPriority(10);System.out.println(t1.getPriority());System.out.println(t2.getPriority());t1.start();t2.start();}
}

2.守護線程

????????③ void setDaemon(boolean on) —— 設置為守護線程,當非守護線程執行完畢,守護線程就要結束,但是守護線程也不是立馬結束,當守護線程結束之后,系統會告訴守護線程人家結束了,你也結束吧,在告知的過程中,守護線程會執行,只不過執行到半路就結束了

package S67ProtectThread;public class Demo201MyThread1 extends Thread{@Overridepublic void run(){for (int i = 0; i < 10; i++) {System.out.println(Thread.currentThread().getName()+"執行了......"+i);}}
}
package S67ProtectThread;public class Demo203MyThread2 extends Thread{@Overridepublic void run(){for (int i = 0; i < 99; i++) {System.out.println(Thread.currentThread().getName()+"執行了..."+i);}}
}
package S67ProtectThread;public class Demo202Test {public static void main(String[] args) {// 創建兩個線程對象Demo201MyThread1 t1 = new Demo201MyThread1();t1.setName("金蓮");Demo203MyThread2 t2 = new Demo203MyThread2();t2.setName("阿慶");// 將t2設置為守護線程t2.setDaemon(true);t1.start();t2.start();}
}

使用場景:

3.禮讓線程

讓兩個線程盡可能的平衡一點->盡量讓兩個線程交替執行

????????④ static void yield() ——?禮讓線程,讓當前線程讓出CPU使用權
場景說明:如果兩個線程一起執行,可能會執行一會兒線程A,再執行一會線程B,或可能線程A執行完畢了,線程B在執行

注意:只是盡可能的平衡,不是絕對的平衡,有可能在禮讓線程之后又搶到了CPU使用權

package S68PoliteThread;public class Demo204MyThread1 extends Thread{@Overridepublic void run(){for (int i = 0; i < 10; i++) {System.out.println(Thread.currentThread().getName()+"...執行了..."+i);// 禮讓線程Thread.yield();}}
}
package S68PoliteThread;public class Demo205Test {public static void main(String[] args) {// 創建兩個線程對象Demo204MyThread1 t1 = new Demo204MyThread1();t1.setName("金蓮");Demo204MyThread1 t2 = new Demo204MyThread1();t2.setName("阿慶");// 禮讓線程Thread.yield();t1.start();t2.start();}
}

?????

4.插入線程? ? ??

⑤ void join() ——?插入線程或者叫做插隊線程

package S69InsertThread;public class Demo206MyThread1 extends Thread{@Overridepublic void run(){for (int i = 0; i < 10; i++) {System.out.println(Thread.currentThread().getName()+"...執行了..."+i);// 插入線程}}
}
package S69InsertThread;public class Demo207Test {public static void main(String[] args) throws InterruptedException {// 創建兩個線程對象Demo206MyThread1 t1 = new Demo206MyThread1();t1.setName("金蓮");t1.start();// 插入線程 表示把t1插入到當前線程之前t1.join();for (int i = 0; i < 10; i++) {System.out.println(Thread.currentThread().getName()+"...執行了..."+i);// 插入線程}t1.start();}
}

五、第二種方式_實現Thread中的Runnable接口

Thread中的run方法重寫的Runnable中的接口,可以直接實現Runnable接口

1.創建類,實現Runnable接口
2.重寫run方法,設置線程任務
3.利用Thread類的構造方法:Thread(Runnable target),創建Thread對象(線程對象),將自定義的類當參數傳遞到Thread構造中 —> 這一步是讓我們自己定義的類成為一個真正的線程類對象

4.調用Thread中的start方法,開啟線程,jvm虛擬機自動調用run方法

package S70ThreadRunnable;public class MyRunnable implements Runnable{@Overridepublic void run(){for (int i = 0; i < 10; i++) {System.out.println(Thread.currentThread().getName()+"...執行了"+i);}}
}
package S70ThreadRunnable;public class Demo208Test {public static void main(String[] args) {MyRunnable myRunnable = new MyRunnable();//        Thread(Runnable target)Thread t1 = new Thread(myRunnable);// 調用Thread中的start方法,開啟線程t1.start();for (int i = 0; i < 10; i++) {System.out.println(Thread.currentThread().getName()+"...執行了"+i);}}
}

六、兩種實現多線程的方式區別

1.繼承Thread:繼承只支持單繼承,有繼承的局限性
2.實現Runnable:沒有繼承的局限性,MyThread extends Fu implements Runnable

七、匿名內部類方式創建多線程

????????嚴格意義上來說,匿名內部類方式不屬于創建多線程方式其中之一,因為匿名內部類形式建立在實現Runnable接口的基礎上完成的

????????匿名內部類回顧:
????????????????1.new 接口/抽象類(){

????????????????????????重寫方法

? ? ? ? ? ? ? ? ? }.重寫的方法();
????????????????2.接口名/類名對象名 = new 接口/抽象類(){

????????????????????????重寫方法

? ? ? ? ? ? ? ? ? }????????
? ? ? ? ? ? ? ? ? 對象名.重寫的方法();

匿名內部類給線程取名
Thread(Runnable target,string name)

????????name指的是給匿名內部類中的線程設置名字

package S70ThreadRunnable;public class Demo209Test02 {public static void main(String[] args) {/*Thread(Runnable r)*/new Thread(new Runnable() {@Overridepublic void run() {for (int i = 0; i < 10; i++) {System.out.println(Thread.currentThread().getName()+"...執行了"+i);}}}).start();new Thread(new Runnable() {@Overridepublic void run() {for (int i = 0; i < 10; i++) {System.out.println(Thread.currentThread().getName()+"...執行了"+i);}}}).start();}
}

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

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

相關文章

基于灰狼優化算法優化支持向量機(GWO-SVM)回歸預測

代碼原理 基于灰狼優化算法優化支持向量機&#xff08;GWO-SVM&#xff09;的回歸預測代碼的原理和流程如下&#xff1a; 1. **初始化灰狼群體**&#xff1a;隨機生成一定數量的灰狼&#xff0c;并初始化它們的位置和速度。 2. **初始化SVM模型參數**&#xff1a;根據問題要…

【JAVA基礎之網絡編程】UDP和TCP協議以及三次握手和四次揮手的過程

&#x1f525;作者主頁&#xff1a;小林同學的學習筆錄 &#x1f525;mysql專欄&#xff1a;小林同學的專欄 目錄 1. 網絡編程 1.1 概述 1.2 網絡編程的三要素 1.2.1 IP地址 1.2.2 InetAddress 1.2.3 端口和協議 1.3 UDP協議 1.3.1 UDP發送數據 1.3.2 UDP接收數據 1.4…

C語言——小知識和小細節18

一、力扣題目 1、題目本體 2、題解 本題目我們使用異或分組的方法來解決。可以在我之前的文章《C語言——操作符CSDN博客》中看一下異或的特點。 由于異或的運算規則為相同為0&#xff0c;不同為1&#xff0c;而且是在二進制補碼上進行操作的&#xff0c;我們可以發現的一個…

c++|多態

c|多態 1 多態的概念2 多態的定義及其實現2.1 滿足多態的條件2.2 虛函數2.3 虛函數的重寫2.4 析構函數適合加virtural嗎2.4 C11 override 和 final2.5 三個概念的對比 3 多態的原理4 抽象類4.1 概念4.2 純虛函數 1 多態的概念 多態的概念&#xff1a;通俗來說&#xff0c;就是…

2413. 最小偶倍數

題目&#xff1a; 給你一個正整數 n &#xff0c;返回 2 和 n 的最小公倍數&#xff08;正整數&#xff09;。 示例 1&#xff1a; 輸入&#xff1a;n 5 輸出&#xff1a;10 解釋&#xff1a;5 和 2 的最小公倍數是 10 。 示例 2&#xff1a; 輸入&#xff1a;n 6 輸出&a…

JS 手寫 節流throttle 防抖debounce函數

防抖debounce // 手寫防抖 function debounce(fn, delay 200) {// timer 在閉包中let timer null// 返回一個函數return function(...args) {if (timer) {clearTimeout(timer) // 清空上次的值}timer setTimeout(() > {fn.apply(this, args) // 透傳 this 和函數參數},…

【再探】設計模式—代理模式

代理是指授權代理人在一定范圍內代表其向第三方進行處理有關事務。 1 代理模式 需求&#xff1a;1&#xff09;將業務代碼與非業務代碼分離&#xff0c;在不改變代碼結構的基礎上&#xff0c;為其添加新的功能。2&#xff09;為系統中的某些操作做同一處理&#xff0c;例如進…

[實例] Unity Shader 逐像素漫反射與半蘭伯特光照

漫反射光照是Unity中最基本最簡單的光照模型&#xff0c;本篇將會介紹在片元著色器中實現反射效果&#xff0c;并會采用半蘭伯特光照技術對其進行改進。 1. 逐頂點光照與逐像素光照 在Unity Shader中&#xff0c;我們可以有兩個地方可以用來計算光照&#xff1a;在頂點著色器…

數據結構:帶頭雙向循環鏈表

目錄 前言 鏈表實現 1.定義節點 2.接口實現 1.開辟新節點 2.初始化 3.打印鏈表 4.添加節點 頭插 尾插 在pos位置之前增加節點 5.刪除節點 判空 頭刪 尾刪 刪除pos位置的節點 6.查找 7.釋放 前言 帶頭雙向循環鏈表的結構最復雜&#xff0c;一般用在單獨存儲數…

z3-加法器實驗

補碼器加減法&#xff0c;運算方法簡介 我們要知道什么是補碼的加法&#xff0c;我們為什么要用補碼的加法&#xff1f; 補碼的加法其實就是將兩個補碼形式的二進制數字直接相加&#xff0c;處理的時候忽略超出固定位數的進位。補碼的加法運算和無符號二進制數的加法操作一樣&…

【最新區塊鏈論文錄用資訊】CCF A — SP 2024 共17篇

Conference&#xff1a;45th IEEE Symposium onSecurity and Privacy CCF level&#xff1a;CCF A Categories&#xff1a;網絡與信息安全 Year&#xff1a;2024 Num&#xff1a;17 Efficient Zero-Knowledge Arguments For Paillier Cryptosystem Paillier 加密系統的有效…

基于python的網頁自動刷新工具

1.下載webdriver https://msedgewebdriverstorage.z22.web.core.windows.net/?prefix122.0.2365.59/下載Edge的瀏覽器驅動 2.安裝selenium pip install selenium4.11.1 3.寫代碼 # -*- coding: utf-8 -*- import tkinter as tk from tkinter import messagebox import thr…

【halcon】set_part 實現平移和縮放 徹悟版

背景 之前寫了一篇關于set_part 的文章 &#xff0c;確實也實現了平移和縮放。平移是對的&#xff0c;但是縮放其實有畸變。這個問題一直都困擾著我&#xff0c;知道昨天連續測試了好幾個小時&#xff0c;直到晚上11點終于完美解決。 坐標和高寬 坐標 再講set_part 之前&am…

免費擼gpt-4o和各種大模型實用經驗分享

項目 Github: https://github.com/MartialBE/one-api 先貼兩張圖&#xff1a; 說明 免費擼AI大模型,各位可以對照下面我給出的大模型記錄表來填&#xff0c;key需要自己去拿&#xff0c;國內都需要手機號驗證&#xff0c;如果你不介意。另外我在自己的博客放出免費API給大家…

模型評價指標筆記:混淆矩陣+F1+PR曲線+mAP

評價指標 二分類評價指標 混淆矩陣 TP: 正確預測為了正樣本&#xff0c;原來也是正樣本 FN: 錯誤的預測為負樣本&#xff0c;原來是正樣本 (漏報&#xff0c;沒有找到正確匹配的數目) FP: 錯誤的預測為正樣本&#xff0c;原來是負樣本 (誤報&#xff0c;沒有的匹配不正確) TN…

CIM模型

CIM 是 Esri 制圖信息模型。 它是一個地圖內容規范,用于記錄在保存、讀取、引用或打開時如何永久保留描述不同項目組件的信息。 該規范以 JSON 表示,適用于 ArcGIS 應用程序和 API 中的地圖、場景、布局、圖層、符號和樣式。 CIM 不僅限于制圖設置。 要了解屬性的組織方式以及…

【Tools】SpringBoot工程中,對于時間屬性從后端返回到前端的格式問題

Catalog 時間屬性格式問題一、需求二、怎么使用 時間屬性格式問題 一、需求 對于表中時間字段&#xff0c;后端創建對應的實體類的時間屬性需要設定格式&#xff08;默認的格式不方便閱讀&#xff09;&#xff0c;再返回給前端。 二、怎么使用 導入jackson相關的坐標&#x…

Vue.js - Vue 的安裝 以及 常用的 Vue 指令 【0基礎向 Vue 基礎學習】

文章目錄 Vue 快速上手1、Vue.js 官網 & Vue.js 的獲取2、創建 Vue 實例&#xff0c;初始化渲染3、插值表達式 安裝 Vue 開發者工具&#xff1a;裝插件調試 Vue 應用Vue 指令1、v-show 指令2、v-if3、v-else & v-else-if4、v-onv-on 調用傳參 5、v-bindv-bind 對于樣式…

【算法】前綴和算法——和為k的子數組之和

題解&#xff1a;和為k的子數組之和(前綴和算法) 目錄 1.題目2.題解思路2.1前綴和 哈希表&#xff0c;算法步驟&#xff1a;2.2細節如下&#xff1a;2.3參考代碼&#xff1a; 3.總結及思考 1.題目 題目鏈接&#xff1a;LINK 2.題解思路 暴力求解自然不用多說&#xff0c;時…