當我們運行真實世界的應用程序時,我們使用優秀的處理器以加快執行速度。然而,僅僅依靠處理器速度並不能使應用程序運行得更快。其中一種創建高效性能應用程序的方法是利用多線程。
什麼是多線程?
多線程是一種編程概念,應用程序可以創建一個小單元的任務並且並行執行。如果你在一台計算機上工作,它可以運行多個應用程序並為它們分配處理能力。一個簡單的程序按順序運行,代碼語句一個接一個執行。這是一個單線程應用程序。但是,如果編程語言支持創建多個線程並將它們傳遞給操作系統以並行運行,則稱為多線程。
多線程 vs 多處理
當我們談論多線程時,我們不關心計算機是否擁有2核處理器還是16核處理器。我們的工作是創建一個多線程應用程序,並讓操作系統處理分配和執行的部分。簡而言之,多線程與多處理無關。
Java 如何支援多執行緒?
Java 對於多執行緒應用有很好的支援。Java 通過 Thread 類別來實現多執行緒。Java Thread 允許我們創建一個輕量級的進程來執行一些任務。我們可以在我們的程式中創建多個執行緒並啟動它們。Java 執行時會負責創建機器級指令並與作業系統一起平行執行它們。
有哪些不同類型的執行緒?
一個應用程式中有兩種類型的執行緒 – 使用者執行緒和 守護執行緒。當我們啟動一個應用程式時,main 是第一個被創建的使用者執行緒。我們可以創建多個使用者執行緒和守護執行緒。當所有使用者執行緒執行完畢時,JVM 會終止程式執行。
什麼是執行緒優先順序?
當我們創建一個線程時,我們可以指定其優先級。我們可以為不同的線程設置不同的優先級,但這並不保證高優先級的線程比低優先級的線程先執行。線程調度器是操作系統實現的一部分,當一個線程啟動時,它的執行受線程調度器的控制,JVM對其執行沒有任何控制。
我們如何在Java中創建線程?
我們可以通過實現Runnable接口或擴展Thread類來創建線程。
Thread t = new Thread(new Runnable(){
@Override
public void run() {
}
});
上面是一個用於創建新線程的一行語句。在這裡,我們創建了一個匿名類作為Runnable。如果您熟悉lambda表達式,我們可以用更短的代碼創建一個線程。
Runnable runnable = () -> System.out.println("Hello");
一旦我們創建了一個線程,我們必須通過調用start()方法來開始它的執行。
runnable.start();
I have written a lot of posts explaining the concepts of multithreading in Java. You can go through these in sequence to learn everything about multithreading, its real-life usage, thread lifecycle, thread pool, etc.
1. Java線程和Runnable
這是關於Thread類和Runnable接口的第一篇文章。您還將了解進程和線程之間的區別,以及使用線程的好處以及如何使用Runnable接口和Thread類來創建線程。本文還將比較Runnable接口和Thread類。
2. Java線程睡眠
Java線程睡眠用於暫停當前線程的執行。我們將在以後的文章中廣泛使用線程睡眠,所以了解它的工作原理以及是否準確是很重要的嗎?
3. Java線程加入
有時我們需要等待其他線程執行完畢後才能繼續執行。我們可以使用線程加入方法來實現這一點,了解它的工作原理以及在什麼情況下應該使用它。
4. Java 线程状态
了解线程的不同状态很重要。学习线程如何改变其状态以及操作系统线程调度器如何改变线程的状态。
5. Java 线程等待、通知和通知全部
Java Object 类包含三个方法来通信资源的锁定状态。通过一个简单的等待-通知实现示例学习如何使用这些 Object 类方法。
6. 線程安全和同步
我們知道線程共享對象資源,這可能導致數據損壞,因為這些操作不是原子的。學習如何使用不同的方法在Java中實現線程安全。閱讀本文以了解正確使用同步、同步方法和同步塊的方法。
7. Java主線程異常
JVM使用main方法創建第一個線程。本文解釋了我們在日常生活中看到的一些常見異常,以及它們的根本原因和如何修復它們。
8. 單例類中的線程安全性
在這篇文章中,您將學習創建單例類的基本概念。不同實現方式中存在哪些線程安全性問題?我們如何實現單例類的線程安全性。
9. Java中的守護線程
A simple article explaining daemon threads and how we can create daemon threads in java.
10. Java的Thread Local
我們知道,線程共享對象的變量,但如果我們想在類級別上創建線程本地變量呢?Java提供了ThreadLocal實用類來創建線程本地變量。閱讀更多了解如何在Java程序中創建ThreadLocal變量。
11. Java線程轉儲
Java線程轉儲提供了當前線程的信息。線程轉儲對於分析應用程序的性能問題非常有用。您可以使用線程轉儲來查找和修復死鎖情況。本文解釋了在Java中生成線程轉儲的不同方法。
12. 如何分析Java中的死鎖
死锁是多个线程相互等待释放资源的情况,导致循环依赖。本文讨论了在Java程序中可能出现死锁的情况。我们如何使用线程转储来找到死锁,并介绍了在Java程序中避免死锁的最佳实践。
13. Java计时器线程
本文介绍了如何使用Java计时器(Java Timer)和TimerTask类来创建定时运行的作业,展示了其用法的示例程序,并介绍了如何取消计时器。
14. Java生产者消费者问题
在Java 5之前,可以使用wait()和notify()方法来解决生产者消费者问题,但是引入了BlockingQueue之后,问题变得非常简单。了解如何使用BlockingQueue来解决Java中的生产者消费者问题。
15. Java 线程池
Java 线程池是一组等待处理任务的工作线程集合。Java 5 引入的 Executor 框架使得在 Java 中创建线程池非常容易。我们可以使用 Executors 和 ThreadPoolExecutor 类来创建和管理线程池。
16. Java Callable 和 Future
有时候我们希望线程能够返回某些值供我们使用。Java 5 提供了 Callable 接口来实现这个功能,它类似于 Runnable 接口。我们可以使用 Executor 框架来执行 Callable 任务。
17. Java FutureTask 範例
FutureTask 類別是實作 Future 介面的具體基礎類別。我們可以將其與 Callable 實作和 Executors 一起使用,以進行異步處理。FutureTask 類別提供了實作方法,用於檢查任務的狀態並在處理完成後將值返回給呼叫程式。當您想要覆寫 Future 介面的一些實作方法時,它非常方便。
結論
多執行緒是一個非常廣泛的主題,在一篇文章中無法涵蓋所有內容。如果您按照上述文章的順序閱讀,您將學到有關 Java 多執行緒的一切。
Source:
https://www.digitalocean.com/community/tutorials/multithreading-in-java