Thread

更新於 2024/09/24閱讀時間約 4 分鐘

程式建立thread,然後會交給硬體中的scheduler去排定執行、切換資源

我們無法強制指定順序,因為電腦有太多任務需要執行,但資源有限,因此會由scheduler去分配、切換資源

電腦能同時執行多項任務,我現在在打字、播youtube聽音樂、跟朋友傳line訊息、下載圖片

雖然程式中可以設定thread的priority,但也只能起到"建議"scheduler的作用,告訴scheduler這一個thread的優先級比較高或比較低,因為還要處理很多跟你程式沒直接關係的任務,因此沒辦法保證一定會依照你設的priority順序執行


Race Condition

如何避免多執行緒同時對一個method或參數做操作? 加上synchronized

class Calculator{
int count;
public synchronized void increment(){
count++;
}
}

因此每次只能有一個thread能使用increment這個method,其他的thread都必須等待


完整程式範例

class Calculator{
int count;
public synchronized void increment(){
count++;
}
}

public class Demo {
public static void main(String[] args) {

Calculator calculator = new Calculator();

Thread t1 = new Thread(() -> {
for (int i = 0; i < 10000; i++) {
calculator.increment();
}
});

Thread t2 = new Thread(() -> {
for (int i = 0; i < 10000; i++) {
calculator.increment();
}
});

t1.start();
t2.start();

try {
t1.join();
t2.join();
} catch (InterruptedException e) {
throw new RuntimeException(e);
}

System.out.println(calculator.count);

}
}

建立兩個thread,t1和t2,分別對Calculator的increment method執行10,000次(數字越大越明顯)

如果第3行沒有synchronized 的話,結果(第35行)就不會輸出預期的20,000

因為中途難免會出現兩個thread同時執行increment的情形

所以需要synchronized


29、30行,join method 的目的是要等thread的內容執行完

才能讓35行印出結果,不然會程式才不會等t1和t2執行完,馬上就會印出結果 0


Thread States 執行緒的狀態

raw-image
  • new: 創建thread
  • runnable: 交給scheduler,待它排定執行(說是排定但其實幾乎都是瞬間的事情)
  • running: 執行
  • waiting: 等待執行完所有該thread該做的事情。做完之後會通知scheduler說可以換別人了
  • dead: 被程式強制終止。常見於終止整個應用程式時


我的Java學習日記
留言0
查看全部
avatar-img
發表第一個留言支持創作者!
Error分為三種 Compile time error Runtime error 俗稱(Exception) Logical error
普通的interface:有一個以上的abstract method Functinal Interface...
所有被宣告在interface中的method都是public abstract 所以interface中的method才不需要特地標上修飾符與abstract interface只體現設計方向 而如何實現此設計
abstract method 一定要在 abstract class裡面 abstract class裡面不一定要有abstract method
public: 可以在任何地方存取(access) private: 只能在同class中存取 default: 只能在同package中存取 protected: 只能在同package,以及它的子class存取。不能在不同package的非子class存取
Java不能同時多重繼承 但是可以多層繼承
Error分為三種 Compile time error Runtime error 俗稱(Exception) Logical error
普通的interface:有一個以上的abstract method Functinal Interface...
所有被宣告在interface中的method都是public abstract 所以interface中的method才不需要特地標上修飾符與abstract interface只體現設計方向 而如何實現此設計
abstract method 一定要在 abstract class裡面 abstract class裡面不一定要有abstract method
public: 可以在任何地方存取(access) private: 只能在同class中存取 default: 只能在同package中存取 protected: 只能在同package,以及它的子class存取。不能在不同package的非子class存取
Java不能同時多重繼承 但是可以多層繼承
你可能也想看
Google News 追蹤
Thumbnail
徵的就是你 🫵 超ㄅㄧㄤˋ 獎品搭配超瞎趴的四大主題,等你踹共啦!還有機會獲得經典的「偉士牌樂高」喔!馬上來參加本次的活動吧!
Thumbnail
隨著理財資訊的普及,越來越多台灣人不再將資產侷限於台股,而是將視野拓展到國際市場。特別是美國市場,其豐富的理財選擇,讓不少人開始思考將資金配置於海外市場的可能性。 然而,要參與美國市場並不只是盲目跟隨標的這麼簡單,而是需要策略和方式,尤其對新手而言,除了選股以外還會遇到語言、開戶流程、Ap
Thumbnail
避免 thread 競速(Race Condition)是多執行緒編程中常見的挑戰之一。 Race Condition 發生在多個執行緒同時訪問和修改共享資源時,因為執行緒之間的執行順序無法預測,可能會導致數據的不一致性或意外行為。 本文主要介紹如何使用Lock來避免此狀況出現。 首先先看沒
Thumbnail
簡要說明 JavaScript 的 Event Loop JavaScript 是單執行緒 (single-threaded) 語言,這意味著它一次只能執行一件事,因此所有函式都需要排隊等待執行,這被稱為同步 (synchronous)。在同步操作中,若函式過多或過於複雜,會導致程式阻塞 (blo
※ 同步概念: 單純地「由上而下」執行程式碼,而且一次只執行一件事,也就是「按順序執行,一個動作結束才能切換到下一個」。缺點是你需要「等待」事情執行完畢,才能繼續往下走。 ※ 非同步概念: 盡可能讓主要的執行程序不需要停下來等待,若遇到要等待的事情,就發起一個「非同步處理」,讓主程序繼續執行,
Thumbnail
電腦只做一件事情: 運算。 我們所看到的任何酷酷的應用: 不論是網頁動畫、遊戲特效、甚至是 AI 說的話,全部都 是由電腦的運算結果組合而成的。 首先我們來梳理一下各個名詞之間的關聯: 1. 運算分成兩個部分: 運算子 (運算的名稱,如: 加法) 和運算元 (運算的對象,如: 8)。運算就是對資
Thumbnail
當你需要在 Python 中執行多個任務,但又不希望它們相互阻塞時,可以使用 threading 模組。 threading 模組允許你在單個程序中創建多個執行緒,這些執行緒可以同時運行,從而實現並行執行多個任務的效果。
Thumbnail
程式與頻率時間 看起來這個問題有些奇怪,程式與頻率時間有什麼關係呢?一旦程式完成,似乎就不需要再理會頻率和時間了。實際上,這可能是一些不熟悉程式設計的人所提出的疑問。了解程式設計最重要的一點是,頻率和時間的安排會直接影響程式的效能和展現速度。 時間的利用 舉例來說,假設一個表單的每筆處理時間為
Thumbnail
關於多執行緒/多行程的使用方式 在Python 3.2版本之後加入了「concurrent.futures」啟動平行任務, 它可以更好的讓我們管理多執行緒/多行程的應用場景,讓我們在面對這種併發問題時可以不必害怕, 用一個非常簡單的方式就能夠處裡, 底下我們將為您展示一段程式碼: imp
Thumbnail
徵的就是你 🫵 超ㄅㄧㄤˋ 獎品搭配超瞎趴的四大主題,等你踹共啦!還有機會獲得經典的「偉士牌樂高」喔!馬上來參加本次的活動吧!
Thumbnail
隨著理財資訊的普及,越來越多台灣人不再將資產侷限於台股,而是將視野拓展到國際市場。特別是美國市場,其豐富的理財選擇,讓不少人開始思考將資金配置於海外市場的可能性。 然而,要參與美國市場並不只是盲目跟隨標的這麼簡單,而是需要策略和方式,尤其對新手而言,除了選股以外還會遇到語言、開戶流程、Ap
Thumbnail
避免 thread 競速(Race Condition)是多執行緒編程中常見的挑戰之一。 Race Condition 發生在多個執行緒同時訪問和修改共享資源時,因為執行緒之間的執行順序無法預測,可能會導致數據的不一致性或意外行為。 本文主要介紹如何使用Lock來避免此狀況出現。 首先先看沒
Thumbnail
簡要說明 JavaScript 的 Event Loop JavaScript 是單執行緒 (single-threaded) 語言,這意味著它一次只能執行一件事,因此所有函式都需要排隊等待執行,這被稱為同步 (synchronous)。在同步操作中,若函式過多或過於複雜,會導致程式阻塞 (blo
※ 同步概念: 單純地「由上而下」執行程式碼,而且一次只執行一件事,也就是「按順序執行,一個動作結束才能切換到下一個」。缺點是你需要「等待」事情執行完畢,才能繼續往下走。 ※ 非同步概念: 盡可能讓主要的執行程序不需要停下來等待,若遇到要等待的事情,就發起一個「非同步處理」,讓主程序繼續執行,
Thumbnail
電腦只做一件事情: 運算。 我們所看到的任何酷酷的應用: 不論是網頁動畫、遊戲特效、甚至是 AI 說的話,全部都 是由電腦的運算結果組合而成的。 首先我們來梳理一下各個名詞之間的關聯: 1. 運算分成兩個部分: 運算子 (運算的名稱,如: 加法) 和運算元 (運算的對象,如: 8)。運算就是對資
Thumbnail
當你需要在 Python 中執行多個任務,但又不希望它們相互阻塞時,可以使用 threading 模組。 threading 模組允許你在單個程序中創建多個執行緒,這些執行緒可以同時運行,從而實現並行執行多個任務的效果。
Thumbnail
程式與頻率時間 看起來這個問題有些奇怪,程式與頻率時間有什麼關係呢?一旦程式完成,似乎就不需要再理會頻率和時間了。實際上,這可能是一些不熟悉程式設計的人所提出的疑問。了解程式設計最重要的一點是,頻率和時間的安排會直接影響程式的效能和展現速度。 時間的利用 舉例來說,假設一個表單的每筆處理時間為
Thumbnail
關於多執行緒/多行程的使用方式 在Python 3.2版本之後加入了「concurrent.futures」啟動平行任務, 它可以更好的讓我們管理多執行緒/多行程的應用場景,讓我們在面對這種併發問題時可以不必害怕, 用一個非常簡單的方式就能夠處裡, 底下我們將為您展示一段程式碼: imp