多線程的使用

進程與線程

進程:

1、進程是指運行中的程序,比如我們使用QQ,就啟動了一個進程,操作系統就會為該進程分配內存空間。當我們使用微信,又啟動了一個進程,操作系統將為其分配新的內存空間。

2、進程是程序的一次執行過程,或是正在運行的一個程序。是一個動態的過程:有它自身的產生、存在和消亡的過程。

線程:

1、線程是由進程創建的,是進程的一個實體。

2、一個進程可以擁有多個線程。

3、分類:? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ???????????????????????????????????????????????????????????? ? ?單線程:同一個時刻,只允許執行一個線程。? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?多線程:同一個時刻,可以執行多個線程。

4、并發與并行

并發:同一個時刻,多個任務交替執行,造成一種“貌似同時”的錯覺,單核CPU就是并發的。

并行:同一個時刻,多個任務同時執行,多核cpu可以實現并行。

注:兩個可以同時存在。

多線程的基本使用

方式一:繼承于?Thread類

步聚:

①創建一個繼承于Threud類的子類
②重寫Thread類的run()
③創建Thread類的子類的對象
④通過此對象調用start()
注:將此線程執行的操作聲明在run()中

start()的作用:
啟動當前線程?②調用當前線程的run()(run就是一個普通的方法)

注:start()方法調用startO()方法后,該線程并不一定會立馬執行,只是將線程變成了可運行狀態。具體什么時候執行,取決于CPU,由CPU統一調度。

問題:
①不能通過直接調用run()的方式來啟動線程(run方法就是一個普通的方法,沒有真正的啟動一個線程(此時run方法所在的線程就是調用run方法的對象所在的線程,而不是由這個對象單獨開辟出一個新的線程)),而且不會向下執行,直到run執行完成。

public static void main (String [] args){a a = new a();a.run();    //此時所在的線程為main線程a.start():    //此時單獨開辟出一個新的線程
}
class a extends Thread{}

②不可讓已經start()的線程去再啟動一個線程。
③要想重新啟動一個線程,須重新創建一個對象。

注:主線程結束,子線程可能還沒結束,所以進程依舊存在(可在控制臺輸入JConsole監控線程的執行情況)。

方式二:實現Runnable接口

步驟:

創建一個實現了Runnable 接口的類。
②實現類去重寫Runnable中的抽象方法:run()。
③創建實現類的對象。
④將此對象作為參數傳遞到Thread類的構造器中,創建Thread類的對象(t=new Thread(③中的對象))。
⑤通過Thread類的對象調用start()。(t.start())

Thread類處理Runnable實現類的簡單實現

class MyThread implements Runnable {private Runnable target = null;    //屬性,類型是 Runnablepublic MyThread(Runnable target){    //傳入接口實現類,初始化target this.target = target;}@0verridepublic void run() {    //動態綁定,調用實現類的run方法if(target != null){target.run();}}    public void start() {    //調用底層邏輯start0();    }public void start0(){    //真正的實現創建線程,并調用run方法run();}}

方法二和方法一的比較

1、開發中,優先選擇實現 Runnable接口的方式。
2、Runnable實現的方式沒有類的單繼承性的局限性。
3、實現的方式更適合來處理多個線程有共同數據的情況。
4、Thread 本身也實現了Runnable接口。


?

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

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

相關文章

數據庫系統概論期末經典大題講解(范式提升、求閉包、求主碼)

上一次我們介紹了數據庫中關系代數查詢,從選擇、投影到連接等操作符,探索了數據庫查詢 大家可以移步我的文章:數據庫系統概論期末經典大題講解(用關系代數進行查詢)-CSDN博客 今天,我們將繼續沿著數據庫系統…

《python每天一小段》--12 數據可視化《1》

歡迎閱讀《Python每天一小段》系列!在本篇中,將使用Python Matplotlib實現數據可視化的簡單圖形。 一、概念 Matplotlib是一個流行的Python數據可視化庫,它提供了豐富的繪圖功能,可以創建各種類型的圖表,包括折線圖、…

Spring框架學習:Bean生命周期

目錄 SpringBean的生命周期 Bean實例屬性填充 三級緩存 常用的Aware接口 Spring IoC容器實例化Bean總結 SpringBean的生命周期 Spring Bean的生命周期是從 Bean 實例化之后,即通過反射創建出對象之后,到Bean成為一個完整對象,最終存儲到…

【MyBatis系列】MyBatis字符串問題

💝💝💝歡迎來到我的博客,很高興能夠在這里和您見面!希望您在這里可以感受到一份輕松愉快的氛圍,不僅可以獲得有趣的內容和知識,也可以暢所欲言、分享您的想法和見解。 推薦:kwan 的首頁,持續學…

SpringBoot + Spring Cloud Alibaba + Nacos實現服務管理

1、參考文檔 Spring Cloud Alibaba參考文檔 https://spring-cloud-alibaba-group.github.io/github-pages/hoxton/zh-cn/index.html Spring Cloud Alibaba官方文檔 https://github.com/alibaba/spring-cloud-alibaba/wiki/ 2、引入 Alibaba 依賴 每個 SpringBoot 都有對應的…

css中2D和3D的區別

CSS中2D和3D的主要區別在于: 維度不同:2D是二維平面,3D是三維空間。可視角度不同:2D只能從一個平面角度看,而3D可以在多個角度上觀察。技術難度不同:3D效果需要更復雜的技術支持,如矩陣變換&am…

javascript實現Stack(棧)數據結構

上一篇文章我們理解了List這種數據結構,知道了它的特點和一些使用場景,這篇文章我們就來看一下棧這種數據結構,這里的棧可不是客棧哦,哈哈 棧其實和List非常像,使用javascript實現都是基于數組來實現 嘗試理解Stack …

6種常見的JS模塊打包器

前言 JS模塊打包器是一種工具,它可以將多個JS文件或模塊合并成一個或多個輸出文件,以便在瀏覽器或其他環境中使用。 JS模塊打包器的作用有: 優化代碼:通過壓縮、混淆、刪除無用代碼等方式,減少代碼的體積和復雜度&…

windows系統和虛擬機上ubuntu系統通過虛擬串口進行通信

本文的目的是實現windows系統和虛擬機上安裝的ubuntu通過串口進行通信。為了直觀觀測串口收發數據的內容,需要在windows系統和ubuntu系統使用串口助手來進行監聽。windows系統端用的監聽工具是串口助手SSCOM,ubuntu系統端使用的串口助手是CuteCom。 ubu…

OpenCL學習筆記(一)開發環境搭建(win10+vs2019)

前言 異構編程開發,在高性能編程中有重要的,筆者本次只簡單介紹下,如何搭建簡單的開發環境,可以供有需要的小伙伴們開發測試使用 一、獲取opencl的sdk庫 1.使用cuda庫 若本機有Nvidia的顯卡,在安裝cuda庫后&#x…

如何提高大模型在超長上下文的表現?Claude實驗表明加一句prompt立即提升效果~

本文來自DataLearnerAI官方網站:如何提高大模型在超長上下文的表現?Claude實驗表明加一句prompt立即提升效果~ | 數據學習者官方網站(Datalearner)https://www.datalearner.com/blog/1051701947131881 Claude 2.1版本的模型上下文長度最高拓展到200K&am…

【Flink系列四】Window及Watermark

3.1、window 在 Flink 中 Window 可以將無限流切分成有限流,是處理有限流的核心組件,現在 Flink 中 Window 可以是時間驅動的(Time Window),也可以是數據驅動的(Count Window)。 Flink中的窗口…

c jpeg YUV圖片幀分割成 8*8 塊 ,與逆向把8*8還原為幀

1. 正向分割為若干8*8 塊 下面的程序為通用程序&#xff0c;可以分割任意塊 #include <stdlib.h> #include <string.h> #include <stdio.h> #include <sys/types.h> #include <sys/stat.h> #include <fcntl.h> #include <stdlib.h>…

如果微軟20年前開發.net core,JAVA會不會和IE一樣倒下了

可以跨平臺&#xff0c;大量類庫&#xff0c;微軟親自操刀&#xff0c;性能一流&#xff0c;因為沒有做跨平臺&#xff0c;.NET被 python,javascript等搶了一半以上市場。 如果微軟早早的推出類似.net core這樣的跨平臺語言&#xff0c;.net程序猿還會出在這樣的尷尬局面嗎眾所…

Java基礎-開發流程以及HelloWorld程序

目錄 1. Java的開發流程2. HelloWorld 1. Java的開發流程 開發Java程序&#xff0c;需要三個步驟&#xff1a;編寫代碼&#xff0c;編譯代碼&#xff0c;運行代碼 2. HelloWorld 編寫代碼 public class HelloWorld {public static void main(String[] args) {System.out.pri…

Ribbon 饑餓加載

Ribbon默認是采用懶加載&#xff0c;即第一次訪問時才會去創建LoadBalanceClient&#xff0c;請求時間會很長而饑餓加載則會在項目啟動時創建&#xff0c;降低第一次訪問的耗時&#xff0c;通過下面配置開啟饑餓加載: 一、懶加載 Ribbon 默認為懶加載即在首次啟動Application…

代碼隨想錄二刷 |二叉樹 | 二叉樹的層序遍歷

代碼隨想錄二刷 &#xff5c;二叉樹 &#xff5c; 二叉樹的層序遍歷 題目描述解題思路代碼實現 題目描述 102.二叉樹的層序遍歷 給你二叉樹的根節點 root &#xff0c;返回其節點值的 層序遍歷 。 &#xff08;即逐層地&#xff0c;從左到右訪問所有節點&#xff09;。 示例…

Flask 最佳實踐(一)

Flask是一個輕量級而強大的Python Web框架&#xff0c;它的簡潔性和靈活性使其成為許多開發者的首選。然而&#xff0c;為了確保項目的可維護性和可擴展性&#xff0c;我們需要遵循一些最佳實踐。本文將探討Flask中一些關鍵的最佳實踐。 1. 項目結構 構建一個清晰的項目結構是…

Java實現Socket聊天室

一、網絡編程是什么&#xff1f; 在網絡通信協議下&#xff0c;不同計算機上運行的程序&#xff0c;進行數據傳輸。 應用場景&#xff1a;即時通訊、網游對戰、金融證券、國際貿易、郵件、等等。 不管是什么場景&#xff0c;都是計算機與計算機之間通過網絡進行數據傳輸。 …

軟件測試之接口測試自動化(詳解版)

本著以和大家交流如何實現高效的接口測試為出發點&#xff0c;本文包含了我在接口測試領域的一些方法和心得&#xff0c;希望大家一起討論和分享&#xff0c;內容包括但不僅限于&#xff1a; 服務端接口測試介紹接口測試自動化介紹接口測試自動化實踐關于接口測試自動化的思考…