目錄
?前言
1.進程和線程
進程
PCB 的作用
并發編程和并行編程
線程
為什么選擇多線程編程
2.在IDEA中如何簡單創建一個線程?
1. 通過繼承Thread類
2. 通過實現 Runnable?接口
3. 使用 Lambda 表達式
3.如何簡單使用jconsloe去查看創建好的線程
?前言
2025來了,這是第一篇博客,算是筆者的學習筆記吧,供和我一樣的初學讀者參考學習,愿我們一同進步!
本篇博客大致簡單地討論如下內容:
1.什么是線程,什么是進程?
2.在IDEA中如何簡單創建一個線程
3.如何簡單使用jconsloe去查看創建好的線程
如果對您有幫助,希望您可以點贊收藏,如果您發現有錯誤的地方請私信筆者,核實無誤后筆者將給予報酬,也歡迎大佬在評論區中對博客內容補充說明,鄙人將一并感激并給予報酬.
1.進程和線程
進程
首先是進程,在筆者的理解中,進程可以簡單形容為‘正在運行中的程序’。操作系統通過創建和管理進程來分配和控制硬件資源,確保每個進程能夠獨立地執行并共享計算機的資源.
這里我們引入一個概念——"pcb".? 即進程控制塊,是操作系統用于管理進程的一個數據結構。它保存了關于進程的重要信息,使得操作系統能夠有效地管理和調度進程。每個進程在創建時,操作系統都會為其分配一個 PCB,并在進程的生命周期內持續維護它。
按照筆者的理解,pcb中有許多屬性,存儲了進程的信息,操作系統也通過pcb來管理我們的進程
PCB的具體作用如下
PCB 的作用
-
存儲進程狀態:
- PCB 保存了進程的狀態信息(如運行中、就緒、阻塞等),幫助操作系統了解進程的當前執行狀態。
- 進程的狀態變化(如從就緒狀態到運行狀態)時,操作系統會更新 PCB。
-
保存程序計數器:
- 程序計數器(Program Counter)保存了進程下一條將要執行的指令的地址。每次進程被切換時,操作系統會保存當前進程的程序計數器,并恢復下一個進程的程序計數器。
-
保存CPU寄存器內容(與2合稱為上下文):
- 當進程被暫停時,CPU 寄存器中的數據(如通用寄存器、堆棧指針等)會被保存到 PCB 中。下次該進程被調度時,操作系統會恢復這些寄存器內容,確保進程從上次暫停的地方繼續執行。
-
存儲內存管理信息:
- PCB 包含與進程地址空間相關的信息,如進程的內存分配、頁表信息等。它幫助操作系統進行內存管理,確保進程在自己的地址空間內運行,并避免不同進程之間的內存沖突。
-
存儲進程調度信息(優先級):
- PCB 中保存了調度信息(如優先級、調度策略等),這些信息用于進程的調度和優先級判斷,幫助操作系統決定哪個進程在何時被調度執行。
-
保存進程標識符(PID):
- 每個進程都有一個唯一的進程標識符(PID)。操作系統通過 PID 來識別不同的進程。PCB 中包含了進程的 PID。
-
記錄進程的資源使用情況(記賬信息):
- PCB 中還保存了進程所擁有的資源信息,比如文件描述符、I/O 設備等資源。這些信息對操作系統在資源分配和回收時非常重要。
以上就是筆者對于進程的簡單介紹,歡迎大家的來糾正和補充
并發編程和并行編程
在介紹線程之前,簡單介紹一下并發,并行編程
簡單來說,假如兩個進程在cpu的兩個核心上同時執行, 就叫并行.
如果一個核心需要執行這兩個進程,就通過輪轉來在短時間內交替執行, 操作系統通過pcb中的"優先級","進程狀態","記賬信息"等屬性來分配資源,這就是并發編程.
并發編程的目的是提高程序的效率,特別是在處理多個任務時。它不要求任務必須在物理上完全同時進行,而是關注如何在合理的時間內調度多個任務,讓它們看起來像是在并行執行。
我的老師告訴我,宏觀上這倆差別不大,統一用"并發"來稱呼
線程
按照筆者學習的知識介紹:
為什么選擇多線程編程
2.在IDEA中如何簡單創建一個線程?
1. 通過繼承Thread類
class MyThread extends Thread {@Overridepublic void run() {while (true) {System.out.println("Thread is running");try {Thread.sleep(1000);} catch (InterruptedException e) {e.printStackTrace();}}}
}public class Demo {public static void main(String[] args) {MyThread thread = new MyThread();thread.start(); // 啟動線程}
}
2. 通過實現 Runnable?接口
class MyRunnable implements Runnable {@Overridepublic void run() {while (true) {System.out.println("Thread is running");try {Thread.sleep(1000);} catch (InterruptedException e) {e.printStackTrace();}}}
}public class Demo {public static void main(String[] args) {MyRunnable myRunnable = new MyRunnable();Thread thread = new Thread(myRunnable);thread.start(); // 啟動線程}
}
3. 使用 Lambda 表達式
Thread y = new Thread(() -> {while (true){System.out.println("one Thread");try {Thread.sleep(1000);} catch (InterruptedException e){e.printStackTrace();throw new RuntimeException(e);}}},"線程一"); // lambda 表達式寫法
// y.setDaemon(true); // 設置為后臺線程y.start(); // 啟動線程
3.如何簡單使用jconsloe去查看創建好的線程
JConsole 是一個 Java 監控工具,用于監控 Java 應用程序的運行時性能,它能夠提供線程、內存、垃圾回收等信息。通過 JConsole,我們可以查看程序的線程狀態、CPU 使用情況等,有助于調試和優化程序。
我們可以在JDK中找到它,如圖
示例代碼?
public class demo2
{public static void main(String[] args) throws InterruptedException {
// Thread t = new MyThread();
// t.start();Runnable runnable = new MyRun();Thread t = new Thread(runnable);
// t.start();Thread y = new Thread(() -> {while (true) {System.out.println("one Thread");try {Thread.sleep(1000);} catch (InterruptedException e) {e.printStackTrace();throw new RuntimeException(e);}}}, "線程一"); // lambda 表達式寫法
// y.setDaemon(true); // 設置為后臺線程y.start(); // 啟動線程while (true) {System.out.println("soyo");Thread.sleep(1000);}}}
打開jconsloe?
即可查看
結尾?
博客的內容就到這,這不是隨便水的,好歹結合了筆者自己的思考,希望有人能看到這里吧,我會很感謝的!