在使用Java實際編程中,多線程可以說是無所不在,凡是需要并發執行的都可以用到它,一個應用程序中不用多線程將會是很糟糕的事情,所以 掌握線程以及它的控制操作是非常重要的 。
通過本篇文章今天帶大家一文掌握線程控制操作,感謝您的觀看。
:pencil2:
:pencil2:
并行:多個CPU核心同時工作,處理不同的任務。
并發:多個任務交替使用 CPU 核心工作,以提高 CPU 利用率。
進程:程序的第一次執行。由操作系統創建并分配資源,執行一個單獨的任務。
進程是系統進行資源分配和調度的獨立單位,每個進程都有自己的內存空間和系統資源。進程內所有線程共享堆存儲空間,保存程序中定義的對象和常量池。
Windows系統中,每個運行的 Java 程序都是一個獨立的進程。
線程:進程內的執行單元,不分配單獨的資源,執行一個單獨的子任務。
線程是進程內調度和分派的基本單位,共享進程資源。每個線程有自己的獨立的棧存儲空間,保存線程執行的方法以及基本類型的數據。
運行的 Java 程序內包含至少一個主線程 main ,用戶可以在 Java 程序中自定義并調用多個線程。 JVM 垃圾回收線程也是一個獨立的線程。
線程除創建狀態 New 和結束狀態 Terminate 外,主要有以下幾種運行狀態:
①運行(Running) :CPU 正在執行線程。
②就緒(Runnable) :線程一切就緒,等待 CPU 執行。
運行/就緒狀態 統稱為可運行狀態 Runnable。 Java 程序中,線程在 運行/就緒狀態 之間的切換由 JVM 自動調度,開發者無法獲知。線程之間的調度采用分優先級多隊列時間的輪轉算法。進程在執行完 CPU 時間片切換到就緒狀態之前會先保存自己的狀態,下次進入運行狀態時再重新加載。
③阻塞(Blocked) :線程因缺少其他資源,比如請求資源被上鎖而暫停執行。在獲得資源后進入就緒狀態。
④等待(Waitting) :線程接受了等待指令,釋放資源暫停執行。在超時/接受喚醒指令后進入就緒狀態。
Runnable 接口內唯一聲明了 run 方法,由 Thread 類實現。開發者在 run 方法中定義運行時線程將要執行的功能,線程開啟后由Java虛擬機自動調用并執行。如果開發者主動調用 run 方法,則只會當作普通方法來執行。
①繼承 Thread 類,重寫 run 方法。
public class MyThread extends Thread {
@Override
public void run() {
System.out.println(Thread.currentThread().getName());
}
}
②實現 Runnable 接口,實現 run 方法。推薦使用,避免了單繼承的局限性。
public class MyThread implements Runnable {
@Override
public void run() {
System.out.println(Thread.currentThread().getName());
}
}
Thread 類定義了 start 方法。調用 start 方法后,系統會開啟一個新線程進入就緒狀態:由 JVM 會自動對線程進行調度,在運行時調用并執行線程的 run 方法。一個線程只能啟動一次。
public class Main {
public static void main(String[] args) {
MyThread t1=new MyThread();
MyThread t2=new MyThread("ThreadName");
t1.start();
t2.start();
}
}
public class Main {
public static void main(String[] args) {
MyThread mythread=new MyThread();
Thread t1=new Thread(mythread); // 由系統指定默認線程名 Thread-X
Thread t2=new Thread(mythread, "ThreadName"); // 開發者自定義線程名
t1.start();
t2.start();
}
}
通過匿名內部類方式,我們可以實現同時定義和啟動線程的簡潔寫法。
public class Main {
public static void main(String[] args) {
Thread thread=new Thread(new Runnable(){
public void run(){
System.out.println(Thread.currentThread().getName());
}
}).start();
}
}
class Test {
public void method() {
System.out.println(Thread.currentThread().getName());
}
}
Thread 類定義了 yield 方法。當前線程執行到 Thread.yield() 方法,會停止運行進入就緒狀態。當線程切換到就緒狀態后,什么時候被 JVM 調度回運行狀態開發者無法控制。
public class ThreadDemo {
public static void main(String[] args) {
MyThread mythread=new MyThread();
Thread t1=new Thread(mythread);
Thread t2=new Thread(mythread);
t1.start();
t2.start();
}
static class MyThread implements Runnable {
@Override
public void run() {
int count=0;
for (int i=0; i < 10000; i++) {
Thread.yield(); // 切換到就緒狀態
count++;
System.out.println(count);
}
}
}
}
Thread 類定義了 sleep 方法。當前線程執行到 Thread.sleep(1000) 方法,會停止運行進入阻塞狀態,但仍會保持對象鎖,其他線程不可訪問其資源。直到超時后才進入就緒狀態。調用 sleep 方法需要捕獲或拋出 InterruptException 異常。
public class ThreadDemo {
public static void main(String[] args) {
MyThread mythread=new MyThread();
Thread t1=new Thread(mythread);
Thread t2=new Thread(mythread);
t1.start();
t2.start();
}
static class MyThread implements Runnable {
@Override
public void run() {
int count=0;
for (int i=0; i < 10000; i++) {
try{
Thread.sleep(1000); // 當前線程暫停 1s
} catch(InterruptException e){
e.printStackTrace();
}
count++;
System.out.println(count);
}
}
}
}
當前線程執行 obj.wait() 方法,線程會停止運行并釋放對象鎖 obj,其他線程可以訪問其資源。同時線程進入 obj 對象的等待池,直到被 notify 方法喚醒進入就緒狀態。調用 wait 方法需要捕獲或拋出 InterruptException 異常。
wait 方法允許計時等待。當前線程執行 obj.wait(1000) 方法,計時結束后線程會被自動喚醒進入就緒狀態。
當前線程執行 obj.notify() 方法,會隨機從 obj 對象等待池中選擇一個線程喚醒,使其進入就緒狀態。但是 notify 方法不會釋放當前進程的對象鎖,如果該線程持有 obj 對象的鎖,當前線程釋放鎖后被喚醒的其他線程才能被執行。如果想被喚醒線程先執行,notify 方法后添加 wait 方法釋放鎖。
當前線程執行 obj.notifyall() 方法,會將所有 obj 對象等待池中所有線程喚醒。
public class ThreadDemo {
public static void main(String[] args) {
MyThread t=new MyThread("t");
synchronized(t) { // 對 t 設置對象鎖
try {
t.start();
System.out.println("1");
t.wait(); // 當前線程釋放 t 鎖,進入 t 對象等待池
System.out.println("4");
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
static class MyThread extends Thread {
@Override
public void run() {
synchronized (this) { // 對 t 設置對象鎖
Thread.sleep(1000);
System.out.println("2");
this.notify(); // 隨機喚醒一個 t 對象等待池中的線程
System.out.println("3");
}
}
}
}
調用 t.stop() 方法可以強制終止線程 t 運行,但強制中斷線程可能會造成意想不到的問題,已不推薦使用。
目前主要采用設置線程中斷標志的方式,向線程發送中止信號。由線程自行終止運行:
t.interrupt()
t.isInterrupted()
t.interrupted()
public class ThreadDemo {
public static void main(String[] args) {
MyThread mythread=new MyThread();
Thread t=new Thread(mythread);
t.start();
try {
Thread.sleep(500);
} catch (InterruptedException e) {}
t.interrupt(); // 設置中斷標志為 true
}
static class MyThread implements Runnable {
@Override
public void run() {
while (true) {
System.out.print("hello");
if(this.isInterrupted()){ // 查看中斷標志,若為 true 結束循環
break;
}
}
}
}
}
原文鏈接:https://blog.csdn.net/m0_63947499/article/details/125416461
上一篇我簡單對七彩虹隱星P16做了個開箱,這篇我來單獨對七彩虹隱星P16性能部分進行測試。
走小米路線的新“星”游戲本?搭載RTX 4060的七彩虹隱星P16開箱
七彩虹隱星P16采用的是藍天Insyde H2O圖形化BIOS,版本號為1.07。這個Insyde BIOS曾經也是主流BIOS之一,常見于神舟、惠普等品牌機上。界面比較簡單,主要包含五個基本常用的功能選項,如果想要解鎖高級模式,那就需要搭配H2OUVE軟件或是UEFI Shell等軟件。如果沒特別需求的話,建議不要輕易改動BIOS參數設定或是刷第三方BIOS。
七彩虹隱星P16預裝的是Windows 11家庭中文版,版本號是22H2(22621.1413),系統沒有預裝Office。以下全部測試也是以該版本進行。從下圖可以看到,七彩虹隱星P16分辨率就是2560*1600@165Hz。
英特爾酷睿i7-12650H是采用Intel 7工藝制程的第12代酷睿H系列移動標壓處理器,屬于中高端型號。英特爾酷睿i7-12650H采用了6顆性能核心+4顆能效核心(6P+4E))的大小核設計,TDP為45瓦,自帶24MB三級緩存。
CPU方面,七彩虹隱星P16在CPU-Z軟件下的單線程性能得分為719.3,高與i7-10700的568和銳龍7-3700X的511,性能提升明顯;多線程分數為5671.1,性能與i7-10700的5625接近,高于銳龍7-3700X的5433。
七彩虹隱星P16在CineBenchR 20下的跑分情況如下,CPU單核得分675cb,多核得分4629 cb;七彩虹隱星P16在CineBenchR 23下的跑分情況如下,CPU單核得分1752 pts,多核得分11729 pts。
七彩虹隱星P16在3DMark CPU Profile下單線程得分為954,最大線程下得分為6759。
七彩虹隱星P16在Geekbench6下的得分情況如下,單核得分為2227,多核得分為9900。
下面我們來看看七彩虹隱星P16內置顯卡性能表現如何。
與PC端的驅動軟件升級不同,筆記本端的驅動升級要慢很多。我這里這臺隱星P16的驅動版本為5月15日發布的531.87,隨著后續版本的升級,對應的軟件和游戲測試結果會比本文中的結果高屬于正常現象。
首先我這里先搭配3DMARK跑個分供部分玩家參考。
七彩虹隱星P16在PCIe功能測試下的帶寬為12.98GB/s。
七彩虹隱星P16在Fire Strike下的跑分為 22730 分,其中顯卡分數為27355。
七彩虹隱星P16在Fire Strike Extreme下的跑分為 12000 分,其中顯卡分數為12625。
七彩虹隱星P16在NVIDIA DLSS功能測試下的結果如下,DLSS關閉的下的幀數為12.02 fps,DLSS3開啟后則提升到了52.93fps,對比原來的12幀高出了4倍以上,可見DLSS 3的性能確實強悍。注意,DLSS3測試下的DLSS輸出分辨率為3840 ×2160,對應的模式為性能模式。
七彩虹隱星P16在Port Royal下的分數為5878,戰地5、APEX Legend、GTA V在1440P Ultra預設參數下的預估游戲性能分別為95+ fps、105+ fps和60+ fps,可以實現2K分辨率、高參數設置下暢玩游戲。
七彩虹隱星P16在AIDA64 GPGPU Benchmark下的性能表現如下,對應的讀寫拷貝性能分別為12514 MB/s、12431 MB/s和829.94 GB/s。
七彩虹隱星P16在GeekBench6 GPU benchmark下的性能得分為97588。
接著來看看七彩虹隱星P16在PCMARK10下得分情況,PCMARK10下的總得分是7151,常用基本功能得分是10135,生產力得分是9199,數位內容創作得分是10645。
七彩虹隱星P16在PCMARK10 extened下得分情況,PCMARK10下的總得分是7923,常用基本功能得分是10085,生產力得分是10047,數位內容創作得分是10542,游戲得分為9971。
七彩虹隱星P16內置一塊512G的七彩虹CN600 Pro,這是一款PCIe 3.0*4硬盤,支持NVMe 1.4協議。七彩虹CN600 PRO采用了是聯蕓科技MAP1202A主控以及國產長江存儲128層TLC存儲顆粒,官方連續讀寫性能分別是3300MB/s和2600MB/s。
在讀寫速度方面,從搭配CrystalDsikMark實際測試來看,七彩虹CN600 Pro讀寫性能分別達到了3541MB/s和2706MB/s,沒有存在虛標的問題。對于追求大容量和讀寫性能的用戶,可以直接升級到2塊2T PCIe 4.0*4的m.2 NVMe SSD。
由于七彩虹隱星P16游戲本預裝單條DDR5 4800MHz內存條,在性能方面的優勢不太明顯,后續有必要手動升級到更高頻率的雙通道DDR5內存條。
下面我來談談七彩虹隱星P16游戲本搭配游戲實測表現如何,我這里選擇了《古墓麗影:暗影》、《Far Cry 6》、《極限競速:地平線5》、《賽博朋克2077》這幾款內置Benchmark的游戲。
《古墓麗影:暗影》參數這里選擇了DX12、2560*1600分辨率、預設畫面質量最高,NVIDIA RTX DLSS對應選項為平衡模式,七彩虹隱星P16游戲本在《古墓麗影:暗影》下的平均幀率為118fps。
《Far Cry 6》在預設畫面質量高、2560*1600分辨率下,七彩虹隱星P16游戲本在《Far Cry 6》下的平均幀率達到了88,可以更加流暢的運行游戲。
《極限競速:地平線5》在視覺預設超高+2560*1440分辨率+光線追蹤質量高下,七彩虹隱星P16游戲本在《極限競速:地平線5》下的平均幀率為100fps,整體表現相對平穩。
最后是支持英偉達RTX DLSS 3技術以及Reflex的《Cyberpunk 2077》,預設光線追蹤Ultra、2560*1600分辨率+DLSS質量 Auto模式下,七彩虹隱星P16游戲本在《Cyberpunk 2077》下的平均幀率為45.04。
如果你修改為超級性能模式的話,那么平均幀率會提升到70.69fps。
在壓力測試這塊,我這里選擇了Furmark@2560*1440分辨率對七彩虹隱星P16游戲本進行壓力測試,不搭配AIDA64進行雙烤壓力測試,室溫30度、無空調。初始測試時七彩虹隱星P16游戲本的顯卡功耗可以達到141.4W。
烤機一段時間后,GPU溫度提升到了84.8攝氏度,對應的功耗也基本穩定在了109W。如果在空調環境下進行測試,這個GPU溫度會更低一些,功耗也會有對應提升。就室溫以及這個測試結果而言,七彩虹隱星P16游戲本在散熱性能方面的表現已經很不錯。
七彩虹隱星P16游戲本整機在這個測試過程中,初期功率可以達到190瓦,之后功耗會在165瓦~190瓦之間波動。
最后聊聊七彩虹這個官方驅動控制中心,這類軟件可以說是品牌類筆記本標準必備的軟件,可以用來調節性能模式、修改燈光、修改按鍵、錄制宏等等。
總的來說,當下酷睿i7-12650H+ RTX 4060 LAPTOP GPU的硬件配置已經成為6000元價位的流行標配,此類筆記本最大的賣點是支持DDR5內存以及支持DLSS 3技術的英偉達RTX 40系Laptop GPU,尤其是開啟DLSS后可以在不犧牲畫質的前提下大幅提升幀率,從而提升流暢的游戲體驗。
作為七彩虹推出的全新系列電競筆記本,七彩虹隱星P16在外觀設計方面采用了辨識度很高的圖案和配色設計,硬件配置可以滿足日常大部分游戲、設計需求,搭配GPU直連設計以及散熱設計方面的優化升級,可以充分發揮CPU和GPU的性能,滿足玩對高性能體驗以及模式下的散熱需求。此外筆記本拆裝也比較方便,日后內存和SSD的擴容升級也比較簡單。
最后想要提醒各位的是,如果你想要給七彩虹隱星P16搭配多功能Type-C口便攜顯示器使用或是搭配多功能Type-C口桌面顯示器使用,務必確認顯示器的Type-C口支持DP傳輸協議,此類顯示器一般都在在Type-C下方標識DP logo,否則的話會無法正常實現畫面輸出功能。
以上就是此次簡單的體驗分享,感謝各位觀看。