Java多線程不會?一文解決——

方法一

  1. 新建類如MyThread繼承Thread類
  2. 重寫run()方法
  3. 再通過new MyThread類來新建線程
  4. 通過start方法啟動新線程

案例:

class MyThread extends Thread {public MyThread(String name) {super(name);}@Overridepublic void run() {for(int i=0;i<10;i++){System.out.println(this.getName() + " " + i );}}}主類:MyThread myThread1 = new MyThread("Thread-1");MyThread myThread2 = new MyThread("Thread-2");MyThread myThread3 = new MyThread("Thread-3");myThread1.start();myThread2.start();myThread3.start();

常用方法

  • static void sleep(T):讓當前線程睡T毫秒
  • static void yield():當前線程從運行變為就緒狀態,重新爭奪cpu
  • void run():執行線程中run()方法(在當前線程中執行)
  • void start():開啟一個新的線程執行run()方法
  • void setName():設置這個線程的名稱
  • String getName():獲取當前線程的名稱
  • void interrupt():中斷執行的子線程
  • void join():等該線程執行完后,再執行當前線程

例:

當前主線程需等待t01,t02,t03線程執行完后再執行。


方法二

  1. 創建新類MyThread實現Runnable接口
  2. 實現接口中的run方法
  3. 創建MyThread對象,再新建Thread對象,將MyThread對象作為構造方法的參數傳入Thread
  4. 通過start方法啟動新的線程

案例:

class MyThread implements Runnable {@Overridepublic void run() {for(int i=0;i<10;i++){System.out.println(Thread.currentThread().getName() + " " + i );}}
}
主類main方法中MyThread myThread1 = new MyThread();Thread myThread2 = new Thread(myThread1);Thread myThread3 = new Thread(myThread1);myThread2.start();myThread3.start();

方法三

  1. 新建類MyThread實現Callable接口
  2. 實現接口中的call方法(有返回值)
  3. 創建MyThread對象,創建FutureTask對象將MyThread對象當作構造方法參數傳入
  4. 創建Thread對象將FutureTask對象當構造方法參數傳入(類似方法二第三步)
  5. 通過start方法啟動新線程
  6. 通過FutureTask對象get方法獲取返回結果

案例:

class MyThread implements Callable{@Overridepublic Object call() throws Exception {for(int i=0;i<10;i++){System.out.println(Thread.currentThread().getName() + " " + i );}Thread.sleep(5000);return 10+20;}
}main方法中:FutureTask futureTask = new FutureTask(new MyThread());Thread thread = new Thread(futureTask);thread.start();Object result = futureTask.get();System.out.println("執行結果:"+result);

實際過程中會出現多線程相關問題,比如兩個線程同時操控一個實例變量或共享變量,可能會存在數據不一致等問題。


編程模型

同步編程模型:線程一執行必須等待線程二執行結束,或相反,兩個線程發生了等待關系。

異步編程模型:線程一和線程二同時執行。

解決方法

方法一

synchronized(鎖的內容,通常為全局唯一例如類main.class){

執行的內容

}

方法二

通過Lock lock = new ReentrantLock()對象來上鎖

lock.lock();//上鎖

執行的內容

lock.unlock();//解鎖

守護線程

一般是一個死循環,所有用戶結束,守護線程也就結束。

開啟方法

void setDaemon(true);

方法四

通過wait()和notify(),notifyAll()方法等待和喚醒線程。


線程池

多線程運行時,系統不斷創建和銷毀新的線程,成本非常高,使用線程池就是最好的選擇。

創建

ExecutorService threadPoll = Executors.newCachedThreadPool();

threadPoll.execute(對象):線程池指派一個線程執行該對象run方法。

關閉線程池

threadPoll.shutdown();


多把鎖

創建

CountDownLatch countDownLatch = new CountDownLatch(鎖的數量);

鎖數量減少

countDownLatch.countDown(); //鎖的數量減一

等待

countDownLatch.await():等待子線程執行完再執行(鎖的數量為0)


感謝觀看——

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

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

相關文章

react dangerouslySetInnerHTML將html字符串以變量方式插入頁面,點擊后出現編輯狀態

1.插入變量 出現以下編輯狀態 2.解決 給展示富文本的標簽添加css樣式 pointerEvents: none

黑馬點評,生成1000個token到redis代碼和1k個token的文件

原來的sql文件里面就可以插入1k個用戶&#xff0c; 這個代碼是從1000個User列表里面生成1k個token到redis里面 ResourceIUserService userService;Resource private StringRedisTemplate stringRedisTemplate;Testpublic void testGetAll() {List<User> users userServ…

activemq推數據給前端的方式

文章目錄 消費者程序接收消息并通過 WebSocket 將消息傳遞給前端 消費者程序接收消息并通過 WebSocket 將消息傳遞給前端 ActiveMQ 是一個開源的消息代理服務&#xff0c;可以用來實現各種消息傳遞模式&#xff0c;包括點對點和發布/訂閱模型。要將數據從 ActiveMQ 推送到前端…

那些年背過的面試題——MySQL篇

本文是技術人面試系列 MySQL 篇&#xff0c;面試中關于 MySQL 都需要了解哪些基礎&#xff1f;一文帶你詳細了解&#xff0c;歡迎收藏&#xff01; WhyMysql&#xff1f; NoSQL 數據庫四大家族 列存儲 Hbase K-V 存儲 Redis 圖像存儲 Neo4j 文檔存儲 MongoDB 云存儲 OSS …

AI大模型的智能心臟:向量數據庫的崛起

在人工智能的飛速發展中,一個關鍵技術正悄然成為AI大模型的智能心臟——向量數據庫。它不僅是數據存儲和管理的革命性工具,更是AI技術突破的核心。隨著AI大模型在各個領域的廣泛應用,向量數據庫的重要性日益凸顯。 01 技術突破:向量數據庫的內在力量 向量數據庫以其快速檢索…

第3章 配置 Vite

1 基本配置 Vite 的配置文件 vite.config.js 是基于 JavaScript 或 TypeScript 的文件&#xff0c;可以使用 ES 模塊語法進行導出。Vite 通過這個配置文件來調整各種構建和開發的選項。 1.1 創建配置文件 在項目根目錄創建 vite.config.js 文件&#xff1a; // vite.config…

RNN、LSTM與GRU循環神經網絡的深度探索與實戰

循環神經網絡RNN、LSTM、GRU 一、引言1.1 序列數據的迷宮探索者&#xff1a;循環神經網絡&#xff08;RNN&#xff09;概覽1.2 深度探索的階梯&#xff1a;LSTM與GRU的崛起1.3 撰寫本博客的目的與意義 二、循環神經網絡&#xff08;RNN&#xff09;基礎2.1 定義與原理2.1.1 RNN…

【Python】組合數據類型:序列,列表,元組,字典,集合

個人主頁&#xff1a;【&#x1f60a;個人主頁】 系列專欄&#xff1a;【??Python】 文章目錄 前言組合數據類型序列類型序列常見的操作符列表列表操作len()append()insert()remove()index()sort()reverse()count() 元組三種序列類型的區別 集合類型四種操作符集合setfrozens…

【CSS in Depth 2精譯】2.5 無單位的數值與行高

當前內容所在位置 第一章 層疊、優先級與繼承第二章 相對單位 2.1 相對單位的威力2.2 em 與 rem2.3 告別像素思維2.4 視口的相對單位2.5 無單位的數值與行高 ??2.6 自定義屬性2.7 本章小結 2.5 無單位的數值與行高 有些屬性允許使用無單位的數值&#xff08;unitless value…

【數據結構與算法】快速排序挖坑法

&#x1f493; 博客主頁&#xff1a;倔強的石頭的CSDN主頁 &#x1f4dd;Gitee主頁&#xff1a;倔強的石頭的gitee主頁 ? 文章專欄&#xff1a;《數據結構與算法》 期待您的關注 ?

前端面試題16(跨域問題)

跨域問題源于瀏覽器的同源策略&#xff08;Same-origin policy&#xff09;&#xff0c;這一策略限制了來自不同源的“寫”操作&#xff08;比如更新、刪除數據等&#xff09;&#xff0c;同時也限制了讀操作。當一個網頁嘗試請求與自身來源不同的資源時&#xff0c;瀏覽器會阻…

網絡配置文件中type

在網絡配置文件中&#xff0c;type是一個參數&#xff0c;用于指定網絡接口的類型。它指定了網絡接口所使用的協議或技術。 以下是一些常見的type參數值&#xff1a; “ethernet”&#xff1a;表示以太網接口&#xff0c;用于連接以太網設備&#xff0c;如有線網卡。 “wifi”…

Python實現ABC人工蜂群優化算法優化隨機森林回歸模型(RandomForestRegressor算法)項目實戰

說明&#xff1a;這是一個機器學習實戰項目&#xff08;附帶數據代碼文檔視頻講解&#xff09;&#xff0c;如需數據代碼文檔視頻講解可以直接到文章最后獲取。 1.項目背景 人工蜂群算法(Artificial Bee Colony, ABC)是由Karaboga于2005年提出的一種新穎的基于群智能的全局優化…

PD虛擬機不能復制Mac的文件怎么回事 PD虛擬機不能復制Mac的文件怎么辦 Parallels Desktop怎么用

PD虛擬機不僅能提供跨系統協作的服務&#xff0c;還能進行虛擬機系統與原生系統間的文件共享、文本復制、文件復制等操作&#xff0c;讓系統間的資源可以科學利用。但在實際操作過程中&#xff0c;PD虛擬機不能復制Mac的文件怎么回事&#xff1f;PD虛擬機不能復制Mac的文件怎么…

linux centos7.9 安裝mysql5.7;root設置客戶端登錄、配置并發、表名大小寫敏感等

查看centos版本 cat /etc/centos-releasecentos版本為7.9 查看是否已安裝mariadb,安裝了需要先刪除 1.查看是否安裝了mariadb和mysql,安裝了需要先刪除 mariadb是mysql的一個分支,但要安裝mysql需要刪除它 執行rpm -qa|grep mariadb,查看mariadb情況 查找到有就刪除 執行…

中小學白名單編程競賽:精英競技場的深度解析

目錄 1. 引言2. 特點3. 為什么參加白名單編程競賽4. 具體競賽介紹4.1 全國中小學信息技術創新與實踐大賽(NOC大賽)4.1.1 面向對象4.1.2 考試內容4.1.3 賽事特點4.1.4 報名時間4.1.5 含金量4.1.6 優缺點4.1.7 賽事流程4.2 藍橋杯大賽4.2.1 面向對象4.2.2 考試內容4.2.3 賽事特…

Day59 動態規劃part12

LC115不同的子序列&#xff08;未掌握&#xff09; 遞推公式與LC392類似&#xff0c;但是初始化略有不同 LC392的dp數組含義為相同字符個數而本體的dp數組含義為出現的次數&#xff0c;因此dp[i][0]1 兩種情況 s[i-1]t[j-1] dp[i][j] dp[i-1][j-1]dp[i][j] dp[i-1][j] s[…

Kubernetes集群性能測試之kubemark集群搭建

Kubernetes集群性能測試之kubemark集群搭建 Kubemark是K8s官方提供的一個對K8s集群進行性能測試的工具。它可以模擬出一個K8s cluster&#xff08;Kubemark cluster&#xff09;&#xff0c;不受資源限制&#xff0c;從而能夠測試的集群規模比真實集群大的多。這個cluster中ma…

運維鍋總詳解系統啟動流程

本文詳細介紹Linux及Windows系統啟動流程&#xff0c;并分析了它們啟動流程的異同以及造成這種異同的原因。希望本文對您理解系統的基本啟動流程有所幫助&#xff01; 一、Linux系統啟動流程 Linux 系統的啟動流程可以分為幾個主要階段&#xff0c;從電源開啟到用戶登錄。每個…

Java筆試|面試 —— 對繼承性的理解

面試/筆試&#xff1a;談談對繼承性的理解>繼承性的好處&#xff1a;-減少了代碼的冗余&#xff0c;提高了復用性-提高了擴展性&#xff08;父類統一擴展、繼承后擴展&#xff09;-為多態的使用&#xff0c;提供了前提>Java中繼承的特點-局限性&#xff1a;類的單繼承性。…