【多線程】-- 01 線程創建之繼承Thread多線程同步下載網絡圖片

多線程

1 簡介

1.1 多任務、多線程

  • 普通方法調用:只有主線程一條執行路徑

  • 多線程:多條執行路徑,主線程和子線程并行交替執行

如下圖所示:

圖1

1.2 程序.進程.線程

一個進程可以有多個線程,例如視頻中同時聽聲音、看圖像、發彈幕等等

Process與Thread:

  • 首先,程序是指令和數據的有序集合,其本身沒有任何運行的含義,是一個靜態的概念
  • 進程則是執行程序的一次執行過程,是一個動態的概念,是系統資源分配的單位
  • 通常在一個進程中可以包含若干個線程,且一個進程中至少有一個線程。線程是CPU調度和執行的單位。例如在之前代碼中接觸到的main()函數即為一個主線程。

【注意】很多多線程是模擬出來的,真正的多線程是指有多個CPU,即多核,如服務器。如果是模擬出來的多線程,即在一個CPU的情況下,在同一時間點,CPU只能執行一個代碼,因為切換的很快,所以就有同時執行的錯覺。

1.3 小結

  • 線程就是獨立的執行路徑
  • 在程序運行時,即使沒有主動創建線程,后臺也會有多個線程,如主線程,gc線程
  • main()稱之為主線程,為系統的入口,用于執行整個程序
  • 在一個進程中,如果開辟了多個線程,線程的運行由調度器安排調度,調度器是與操作系統緊密相關的,先后順序是不能人為干預的
  • 對同一份資源操作時,會存在資源搶奪的問題,需要加入并發控制
  • 線程會帶來額外的開銷,例如CPU調度時間,并發控制開銷
  • 每個線程在自己的工作內存交互,內存控制不當會造成數據不一致

2 線程創建

三種創建方式:

  • Thread class --> 繼承Thread類
  • Runnable接口 --> 實現Runnable接口
  • Callable接口 --> 實現Callable接口

前兩種創建方式為重點,對于第三種創建方式,現階段了解即可。

2.1 Thread

【學習提示】查看JDK幫助文檔

  • 自定義線程類以繼承Thread類
  • **重寫run()**方法,編寫線程執行體
  • 創建線程對象,**調用start()**方法啟動線程
package com.duo.demo01;//創建線程方式一:繼承Thread類,重寫run()方法,調用start()開啟線程
public class ThreadTest1 extends Thread {@Overridepublic void run() {//run方法線程體for (int i = 0; i < 5; i++) {System.out.println("在寫代碼" + i);}}public static void main(String[] args) {  //main線程,主線程//創建一個線程對象ThreadTest1 threadTest1 = new ThreadTest1();//調用start()方法開啟線程threadTest1.start();for (int i = 0; i < 5; i++) {System.out.println("在看視頻" + i);}}
}
//注意:線程開啟不一定立即執行,由CPU調度執行

運行結果:

圖2

如果按照之前學習的思路,"在看視頻"字符串應當會按照代碼順序在執行完threadTest1線程后才輸出,然而如上所示,"在看視頻"和"在寫代碼"字符串是交替完成輸出的,這表明主線程與所建線程同時執行,而且可以得出,線程開啟后不一定立即執行,由CPU調度執行

【練習】多線程同步下載圖片

package com.duo.demo01;import org.apache.commons.io.FileUtils;import java.io.File;
import java.io.IOException;
import java.net.URL;//練習Thread,實現多線程同步下載圖片
public class ThreadTest2 extends Thread {private String url;  //網絡圖片地址private String name;  //下載保存的圖片文件名public ThreadTest2(String url, String name) {//構造器傳參this.url = url;this.name = name;}//下載圖片線程的執行體@Overridepublic void run() {webDownLoader webDownLoader = new webDownLoader();webDownLoader.downLoader(url, name);System.out.println(name + "已下載完成");}public static void main(String[] args) {ThreadTest2 t1 = new ThreadTest2("https://img-blog.csdnimg.cn/a4bbb67340ce46a293b725868b3997b4.jpeg", "星空.jpg");ThreadTest2 t2 = new ThreadTest2("https://img-blog.csdnimg.cn/8dc90f70dca8437d868c655bcd0db7fc.jpeg", "黃昏.jpg");ThreadTest2 t3 = new ThreadTest2("https://img-blog.csdnimg.cn/cc83486a8a7b46a193dac95decc4ad31.jpeg", "曠野.jpg");t1.start();t2.start();t3.start();}
}//下載器類
class webDownLoader {//下載方法public void downLoader(String url, String name) {try {FileUtils.copyURLToFile(new URL(url), new File(name));} catch (IOException e) {System.out.println("IO異常,downLoader方法出現問題");}}
}

運行結果:

圖3

同樣可以發現,下載執行的順序并非是按照主線程中t1.start() --> t2.start() --> t3.start()的順序(“星空” --> “黃昏” --> “曠野”)完成。


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

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

相關文章

idea 問題合集

調試按鈕失效&#xff1a; 依次點擊&#xff1a;Modules-web-src-Sources&#xff0c;重啟IDEA即可&#xff08;網上看到的方法&#xff0c;原因呢未明&#xff09;

U-boot(四):start_armboot

本文主要探討210的uboot啟動的第二階段&#xff0c;主要函數為start_armboot。 uboot 一階段初始化SoC內部部件(看門狗、時鐘等),初始化DDR,重定位 二階段初始化其余硬件(iNand、網卡芯片)以及命令、環境變量等 啟動打印硬件信息,進入bootdelay,讀秒完后執行bootc…

SpringCloud Alibaba集成 Gateway(自定義負載均衡器)、Nacos(配置中心、注冊中心)、loadbalancer

文章目錄 POM依賴環境準備配置配置文件配置類 案例展示 POM依賴 <parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>2.7.10</version><relativePath/></p…

【華為OD】C卷真題 100%通過:執行時長 C/C++實現

【華為OD】C卷真題 100%通過:執行時長 C/C實現 目錄 題目描述&#xff1a; 示例1 示例2 代碼實現&#xff1a; 題目描述&#xff1a; 為了充分發揮GPU算力&#xff0c;需要盡可能多的將任務交給GPU執行&#xff0c;現在有一個任務數組&#xff0c;數組元素表示在這1秒內…

百度ai試用

JMaven Central: com.baidu.aip:java-sdk (sonatype.com) Java sdk地址如上&#xff1a; 文心一言開發者 文心一言 (baidu.com) ERNIE Bot SDK提供便捷易用的接口&#xff0c;可以調用文心一言的能力&#xff0c;包含文本創作、通用對話、語義向量、AI作圖等。 pip install…

什么是輕量應用服務器?可以從亞馬遜云科技的優勢入手了解

什么是輕量應用服務器&#xff1f; 隨著如今各行各業對云計算的需求越來越多&#xff0c;云服務器也被越來越多的企業所廣泛采用。其中&#xff0c;輕量應用服務器是一種簡單、高效、可靠的云計算服務&#xff0c;能夠為開發人員、企業和個人提供輕量級的虛擬專用服務器&#x…

PTP精密時鐘同步(1588)如何完成精準時間同步?

PTP精密時鐘同步&#xff08;1588&#xff09;如何完成精準時間同步&#xff1f; PTP精密時鐘同步&#xff08;1588&#xff09;如何完成精準時間同步&#xff1f; 引言   以太網技術由于其開放性好、價格低廉和使用方便等特點&#xff0c;已經廣泛應用于電信級別的網絡中&am…

Centos部署GitLab-備份恢復

1. 下載rpm包 wget https://mirrors.tuna.tsinghua.edu.cn/gitlab-ce/yum/el7/gitlab-ce-10.8.4-ce.0.el7.x86_64.rpm2. 安裝依賴 yum -y install policycoreutils openssh-server openssh-clients postfix policycoreutils-python3. rpm安裝 rpm -ivh gitlab-ce-10.8.4-ce.…

TCP 重傳、滑動窗口、流量控制、擁塞控制的剖析

TCP 是一個可靠傳輸的協議&#xff0c;那它是如何保證可靠的呢&#xff1f; 為了實現可靠性傳輸&#xff0c;需要考慮很多事情&#xff0c;例如數據的破壞、丟包、重復以及分片順序混亂等問題。如不能解決這些問題&#xff0c;也就無從談起可靠傳輸。 那么&#xff0c;TCP 是…

zend studio 的主題安裝、卸載和更新

zend studio的主題插件安裝 我的zend studio版本是13.6 在Welcome頁面右側看到有好多插件可以安裝&#xff0c;現在我們來安裝主題&#xff0c;主題插件就是Eclipse Color Theme。先選中Eclipse Color Theme選項打勾&#xff0c;然后點擊Apply changs 按鈕進行安裝。 安裝完成…

深入理解移動端H5視頻通話中的攝像頭切換實踐

在移動端H5應用中實現視頻通話功能,已經成為現代Web應用的標配之一。隨著Web技術的發展,我們不僅能夠在桌面瀏覽器上實現復雜的視頻通話功能,也能夠在移動端瀏覽器中提供幾乎原生應用級別的流暢體驗。本文將詳細介紹如何在使用聲網(Agora)Web SDK的移動端H5應用中實現攝像…

亞馬遜云科技向量數據庫助力生成式AI成功落地實踐探秘(一) ?

隨著大語言模型效果明顯提升&#xff0c;其相關的應用不斷涌現呈現出越來越火爆的趨勢。其中一種比較被廣泛關注的技術路線是大語言模型&#xff08;LLM&#xff09;知識召回&#xff08;Knowledge Retrieval&#xff09;的方式&#xff0c;在私域知識問答方面可以很好的彌補通…

案例023:基于微信小程序的童裝商城的設計與實現

文末獲取源碼 開發語言&#xff1a;Java 框架&#xff1a;SSM JDK版本&#xff1a;JDK1.8 數據庫&#xff1a;mysql 5.7 開發軟件&#xff1a;eclipse/myeclipse/idea Maven包&#xff1a;Maven3.5.4 小程序框架&#xff1a;uniapp 小程序開發軟件&#xff1a;HBuilder X 小程序…

Nginx503有哪些解決辦法

還是經常見到的服務部署問題&#xff0c;今天遇見的是503&#xff1a; 503 的可能原因 Nginx 返回 503 錯誤通常表示服務暫時不可用。一些常見的原因包括&#xff1a; 后端服務故障&#xff1a;后端服務可能由于程序錯誤、崩潰或異常情況而無法正常響應請求。這可能是由于服…

在vue或者react或angular中,模板表達式中的箭頭函數是無效的嗎?為什么無效?

出現此問題的背景&#xff1a; 我在Angular項目中對一個標簽屬性綁定了一個箭頭函數&#xff0c;編譯報錯。 在vue或者react或angular中&#xff0c;模板表達式中的箭頭函數是無效的嗎&#xff1f; 在 Vue、React 或 Angular 中&#xff0c;模板表達式中的箭頭函數是無效的。…

Java常量池理論篇:Class常量池、運行時常量池、String常量池、基本類型常量池,intern方法1.6、1.7的區別

文章目錄 Class常量池運行時常量池String常量池基本類型常量池Integer 常量池Long 常量池 加餐部分 Class常量池 每個Class字節碼文件中包含類常量池用來存放字面量以及符號引用等信息。 運行時常量池 java文件被編譯成class文件之后&#xff0c;也就是會生成我上面所說的 …

webshell之基于框架免殺

thinkphp array_map_recursive函數 array_map_recursive函數分析 這里存在一個call_user_func命令執行函數 免殺效果 B函數 免殺效果 B函數分析 exec函數分析 在exec函數用存在有個類調用&#xff0c;且所有的參數都可控 smarty_php_tag函數 免殺效果 smarty_php_tag函數分析…

【開源】基于Vue.js的數據可視化的智慧河南大屏

項目編號&#xff1a; S 059 &#xff0c;文末獲取源碼。 \color{red}{項目編號&#xff1a;S059&#xff0c;文末獲取源碼。} 項目編號&#xff1a;S059&#xff0c;文末獲取源碼。 目錄 一、摘要1.1 項目介紹1.2 項目錄屏 二、功能模塊三、系統展示四、核心代碼4.1 數據模塊 …

HTML新手入門筆記整理:塊元素和行內元素

塊元素 在HTML中&#xff0c;塊元素在瀏覽器顯示狀態下獨占一行&#xff0c;并且排斥其他元素與其位于一行。一般情況下&#xff0c;塊元素內部可以容納其他塊元素和行內元素。 常見塊元素 塊元素 說明 h1~h6 標題元素 p 段落元素 div div元素 hr 水平線 ol 有序列…

打印菱形-第11屆藍橋杯選拔賽Python真題精選

[導讀]&#xff1a;超平老師的Scratch藍橋杯真題解讀系列在推出之后&#xff0c;受到了廣大老師和家長的好評&#xff0c;非常感謝各位的認可和厚愛。作為回饋&#xff0c;超平老師計劃推出《Python藍橋杯真題解析100講》&#xff0c;這是解讀系列的第9講。 打印菱形&#xff…