Java基礎 Day24

一、進程和線程

1、進程

(1)概念

進程 (Process) 是計算機中的程序關于某數據集合上的一次運行活動

是系統進行資源分配的基本單位

簡單理解:程序的執行過程(正在運行的應用程序)

(2)特性

獨立性:每一個進程都有自己的空間,在沒有經過進程本身允許的情況下,一個進程不可以直接訪問其它的的進程空間

動態性:進程是動態產生,動態消亡的

并發性:任何進程都可以同其它進程一起并發執行

Tips:

并行:在同一時刻,有多個指令在多個CPU上【同時】執行

并發:在同一時刻,有多個指令在單個CPU上【交替】執行

多進程同時工作:對于一個CPU(單核),它是在多個進程間輪換執行的

2、線程

(1)概念

線程(Thread):進程可以同時執行多個任務,每個任務就是線程

(2)多線程的意義

提高執行效率;同時處理多個任務

隨著處理器上的核心數量越來越多,現在大多數計算機都比以往更加擅長并行計算

但是,一個線程,在一個時刻,只能運行在一個處理器核心上

Java程序也是一個進程,如果是一個單線程程序,則無法調動處理器的多個核心

二、Java中開啟線程的方式

Tips:Java程序默認是多線程的,一條主線程,一條垃圾回收線程

1、法一:繼承Thread類

步驟:

(1)編寫一個類繼承Thread類

(2)重寫run方法

(3)將線程任務寫在run方法中

(4)創建線程對象

(5)調用start方法開啟線程

注意:直接調用run方法并不能開啟線程

2、法二:實現Runnable接口

(擴展性更好)

步驟:

(1)編寫一個類實現Runnable接口

(2)重寫run方法

(3)將線程任務寫在run方法中

(4)創建線程任務資源對象

(5)創建線程對象,將資源傳入

(6)使用線程對象調用start方法開啟線程

public class ThreadDemo2 {public static void main(String[] args) {
//        (4)創建線程任務資源對象MyRunnable mr = new MyRunnable();
//        (5)創建線程對象,將資源傳入Thread t1 = new Thread(mr);
//        (6)使用線程對象調用start方法開啟線程t1.start();for (int i = 0; i < 100; i++) {System.out.println("main" + i);}}
}//(1)編寫一個類實現Runnable接口
class MyRunnable implements Runnable {
//    (2)重寫run方法@Overridepublic void run() {
//        (3)將線程任務寫在run方法中for (int i = 0; i < 100; i++) {System.out.println("MyRunnable" + i);}}
}

3、法三:實現Callable接口

(線程任務有返回值)

步驟:

(1)編寫一個類實現Callable接口

(2)重寫call方法

(3)將線程任務寫在call方法中

(4)創建線程任務資源對象

(5)創建線程任務對象,封裝線程資源

(6)創建線程對象,傳入線程任務

(7)使用線程對象調用start方法開啟線程

public class ThreadDemo3 {public static void main(String[] args) throws ExecutionException, InterruptedException {MyCallable mc = new MyCallable();FutureTask<Integer> task = new FutureTask<>(mc);Thread thread = new Thread(task);thread.start();Integer result = task.get(); // 獲取線程任務的返回值System.out.println(result);}
}class MyCallable implements Callable<Integer> {@Overridepublic Integer call() throws Exception {int sum = 0;for (int i = 0; i <= 100; i++) {sum += i;}return sum;}
}

三、線程的相關方法

String?getName?()

返回此線程的名稱

void?setName?(String?name)

設置線程的名字(構造方法也可以設置名字)

static?Thread?currentThread()

獲取當前線程的對象

static?void?sleep(long?time)

讓線程休眠指定的時間,單位為毫秒

setPriority(int?newPriority)

設置線程的優先級,從1到10,默認為5

final?int?getPriority()

獲取線程的優先級

final?void?setDaemon(boolean?on)

設置為守護線程

Tips:線程的調度方式分為搶占式調度(隨機)和非搶占式調度(輪流)

Java 采用的方式是搶占式調度

提高線程的優先級可以提高該線程搶到CPU的概率

四、線程安全和同步

1、安全問題出現的條件

是多線程環境

有共享數據

有多條語句操作共享數據

2、同步技術

將多條語句操作共享數據的代碼給鎖起來,讓任意時刻只能有一個線程可以執行

(1)同步代碼塊

格式:
synchronized(鎖對象) {多條語句操作共享數據的代碼
}示例:
public class TicketDemo {public static void main(String[] args) {// 只new了一個TicketTask對象,三個線程共享一份數據TicketTask ticket = new TicketTask();Thread t1 = new Thread(ticket);Thread t2 = new Thread(ticket);Thread t3 = new Thread(ticket);t1.start();t2.start();t3.start();}
}class TicketTask implements Runnable {private int tickets = 2000;@Overridepublic void run() {while (true) {// 建議使用字節碼文件作為鎖對象synchronized (TicketTask.class) {if (tickets <= 0) {break;}System.out.println(Thread.currentThread().getName() + " sold " + tickets);tickets--;}}}
}   

Tips:鎖對象可以是任意對象,但是需要保證多條線程的鎖對象,是同一把鎖

同步可以解決多線程的數據安全問題,但是也會降低程序的運行效率

(2)同步方法

在方法的返回值類型前面加入 synchronized?關鍵字

該方法里的代碼就變成同步的

靜態方法的鎖對象是字節碼對象,非靜態方法的鎖對象是 this

(3)Lock 鎖

使用 Lock 鎖,可以更清晰地看到哪里加了鎖,哪里釋放了鎖

Lock 是接口,無法直接創建對象

public?ReentrantLock()

構造方法:創建一個?ReentrantLock?的實例互斥鎖

void?lock()

加鎖

void?unlock();

釋放鎖

3、死鎖

兩個或者多個線程互相持有對方所需要的資源

導致這些線程處于等待狀態,無法前往執行

產生死鎖的情況:同步嵌套

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

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

相關文章

C#學習:基于LLM的簡歷評估程序

前言 在pocketflow的例子中看到了一個基于LLM的簡歷評估程序的例子&#xff0c;感覺還挺好玩的&#xff0c;為了練習一下C#&#xff0c;我最近使用C#重寫了一個。 準備不同的簡歷&#xff1a; 查看效果&#xff1a; 不足之處是現實的簡歷應該是pdf格式的&#xff0c;后面可以…

git怎么合并兩個分支

git怎么合并分支代碼 注意: 第一步你得把當前分支合到遠程分支去才能有下面的操作 另外我是將develop分支代碼合并到release分支去 git 命令 查看本地所有分支 git branch切換分支 例如切換到release分支 git checkout release拉取代碼 git pull up release 合并分支 …

Android-kotlin協程學習總結

Kotlin協程實戰對話? ?真題1&#xff1a;協程與線程的本質區別是什么&#xff1f;為什么說協程是輕量級的&#xff1f;?? ?面試官?&#xff1a; “我看你項目中用協程替代了線程池&#xff0c;能說說協程和線程的核心區別嗎&#xff1f;為什么協程更適合高并發&#xf…

uni-app學習筆記十四-vue3中emit的使用

在組件傳值中&#xff0c;無論是props還是slot都是單向數據流&#xff0c;父組件向子組件傳值&#xff0c;子組件不能直接對父組件傳過來的值進行重新賦值。 下面學習子組件向父組件傳值的工具--emit。 在子組件emit設置傳遞的函數名和值 <template><view>子組件…

Java設計模式從基礎到實際運用

第一部分&#xff1a;設計模式基礎 1. 設計模式概述 設計模式(Design Pattern)是一套被反復使用、多數人知曉的、經過分類編目的代碼設計經驗的總結&#xff0c;它描述了在軟件設計過程中一些不斷重復出現的問題以及該問題的解決方案。設計模式是在特定環境下解決軟件設計問題…

鴻蒙OSUniApp 制作自定義的進度條組件#三方框架 #Uniapp

使用 UniApp 制作自定義的進度條組件 在移動應用開發中&#xff0c;進度條是非常常見的 UI 組件&#xff0c;無論是文件上傳、下載、任務進度還是表單填寫反饋&#xff0c;進度條都能為用戶提供直觀的進度提示。雖然 UniApp 提供了一些基礎的進度條能力&#xff0c;但在實際項…

Python爬蟲實戰:研究Beautiful Soup框架相關技術

1. 引言 1.1 研究背景與意義 隨著互聯網的快速發展,網絡上的數據量呈爆炸式增長。如何從海量的網頁數據中高效提取有價值的信息,成為信息科學領域的重要研究課題。網絡爬蟲作為一種自動獲取網頁內容的技術,能夠按照預設規則遍歷互聯網并采集數據,為信息檢索、輿情分析、商…

【Tips】關于PCI和PCIe的配置空間差異和io/memory io讀寫

最近在看同事2023年講的PCI基礎課&#xff0c;感覺確實是豁然開朗了&#xff0c;贊美同事。 PCIe實際上是PCI的擴展&#xff08;extended&#xff09;&#xff0c;PCIe設備相當于是迭代升級產品。 而PCIe的配置空間基于PCI原有的0xFF&#xff08;256字節&#xff09;配置空間…

桂花網體育運動監測方案:開啟幼兒園運動健康管理新篇章

在幼兒教育領域&#xff0c;運動能力的培養與健康監測始終是備受關注的核心環節。隨著科技的飛速發展&#xff0c;如何科學、有效地監測幼兒的運動狀態&#xff0c;成為了幼兒園教育者面臨的一大挑戰。桂花網體育運動監測方案憑借其高效、精準、智能化的特性&#xff0c;為幼兒…

Perforce P4產品簡介:無限擴展+全球協作+安全管控+工具集成(附下載)

本產品簡介由Perforce中國授權合作伙伴——龍智編輯整理&#xff0c;旨在帶您快速了解Perforce P4版本控制系統的強大之處。 世界級無限可擴展的版本控制系統 Perforce P4&#xff08;原Helix Core&#xff09;是業界領先的版本控制平臺&#xff0c;備受19家全球Top20 AAA級游…

pikachu靶場通關筆記08 XSS關卡04-DOM型XSS

目錄 一、XSS原理 二、DOM型XSS 三、源碼分析 1、進入靶場 2、XSS探測 3、源碼分析 四、滲透實戰 1、Payload1 2、Payload2 3、Payload3 本系列為通過《pikachu靶場通關筆記》的XSS關卡(共10關&#xff09;滲透集合&#xff0c;通過對XSS關卡源碼的代碼審計找到XSS風…

安全訪問 std::tuple 的容錯方法及氣象領域應用

安全訪問 std::tuple 的容錯方法及氣象領域應用 1. std::tuple 安全訪問的核心問題 1.1 元組結構性問題&#xff08;編譯時錯誤&#xff09; 當元組元素數量為空時&#xff08;std::tuple<>&#xff09;&#xff0c;任何訪問元素的嘗試都會導致編譯錯誤?&#xff1a;…

Webug4.0靶場通關筆記03- 第3關SQL注入之時間盲注(手注法+腳本法 兩種方法)

目錄 一、源碼分析 1.分析閉合 2.分析輸出 &#xff08;1&#xff09;查詢成功 &#xff08;2&#xff09;查詢失敗 &#xff08;3&#xff09;SQL語句執行報錯 二、第03關 延時注入 1.打開靶場 2.SQL手注 &#xff08;1&#xff09;盲注分析 &#xff08;2&#xf…

【大模型學習網絡互聯】Memory-Mapped I/O MMIO語義與MEM語義

MMIO語義和MEM語義的區別 嗯&#xff0c;用戶要求更詳細地區分MMIO和MEM語義&#xff0c;看來之前的中文對比雖然系統但還不夠深入。用戶可能是嵌入式開發者或OS內核學習者&#xff0c;需要從硬件行為層面理解差異。 用戶連續追問MMIO相關概念&#xff0c;說明ta在接觸底層開發…

如何在使用kickstart安裝物理機操作系統的過程中核對服務器的SN

原因 在使用kickstart對物理機進行重裝的時候&#xff0c;由于自動化配置&#xff0c;掛載鏡像重啟之后就會自動化開始安裝部署&#xff0c;不夠安全&#xff0c;萬一選錯服務器沒有辦法回退。因此可以在kickstart的ks配置文件中新增服務器SN的校驗&#xff0c;當校驗不通過的…

spring4第4課-ioc控制反轉-詳解如何注入參數

堅持住&#xff0c;第四天&#xff0c;繼續學習spring4.詳解如何注入參數 先總結&#xff0c;主要有如下6種&#xff1a; 1&#xff0c;基本類型值&#xff1b; 2&#xff0c;注入 bean&#xff1b; 3&#xff0c;內部 bean&#xff1b; 4&#xff0c;null 值&#xff1b; 5&…

cf2067A

原題鏈接&#xff1a;https://codeforces.com/contest/2067/problem/A 題目背景&#xff1a; 給定x,y&#xff0c;判讀是否存在 n 滿足S(n) x&#xff0c;S(n 1) y。定義 S(a) 等于 a 的十進制位數之和。 思路&#xff1a; 不難發現一般 n 和 n 1 的位數之和相差為 1&…

微信小程序獲取手機號

詳細代碼 <t-button size"large" theme"primary" variant"outline" data-type"hasCancelBtn" bind:tap"showDialog" block style"display: none;">開放能力按鈕 </t-button> <t-dialog id"t-…

AI重構SEO關鍵詞精準定位

內容概要 隨著AI技術深度滲透數字營銷領域&#xff0c;傳統SEO關鍵詞定位模式正經歷系統性重構。基于自然語言處理&#xff08;NLP&#xff09;的智能語義分析引擎&#xff0c;可突破傳統關鍵詞工具的局限性&#xff0c;通過解析長尾搜索詞中的隱含意圖與語境關聯&#xff0c;…

四足機器人環境監測系統相關問題

一、在設計四足機器人監測與跟蹤系統整體架構時&#xff0c;你主要考慮了哪些因素&#xff1f;為什么這樣設計以確保系統的高效性與穩定性&#xff1f; 在設計四足機器人監測與跟蹤系統整體架構時&#xff0c;主要考慮了傳感器兼容性與通信效率、多任務并發處理能力、實時數據…