### 7. 線程池
線程池是管理和復用線程的機制,可以避免頻繁創建和銷毀線程的開銷。Java 提供了 `Executor` 框架來管理線程池。
#### 7.1 使用 Executors 工廠類
`Executors` 工廠類提供了一些靜態方法,用于創建常見類型的線程池。
```java
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
public class Main {
? ? public static void main(String[] args) {
? ? ? ? ExecutorService executorService = Executors.newFixedThreadPool(3);
? ? ? ? for (int i = 0; i < 5; i++) {
? ? ? ? ? ? executorService.execute(() -> {
? ? ? ? ? ? ? ? System.out.println(Thread.currentThread().getName() + " is running");
? ? ? ? ? ? });
? ? ? ? }
? ? ? ? executorService.shutdown();
? ? }
}
```
常見的線程池類型:
- `newFixedThreadPool(int nThreads)`:創建一個固定大小的線程池。
- `newCachedThreadPool()`:創建一個緩存線程池,根據需要創建新線程,并重用空閑線程。
- `newSingleThreadExecutor()`:創建一個單線程執行器,確保任務按順序執行。
- `newScheduledThreadPool(int corePoolSize)`:創建一個支持定時和周期性任務的線程池。
### 8. 高級特性
#### 8.1 線程組
線程組(ThreadGroup)可以用來管理一組線程,方便統一操作(如中斷所有線程)。
```java
public class Main {
? ? public static void main(String[] args) {
? ? ? ? ThreadGroup group = new ThreadGroup("MyThreadGroup");
? ? ? ? Thread thread1 = new Thread(group, () -> {
? ? ? ? ? ? System.out.println(Thread.currentThread().getName() + " is running");
? ? ? ? }, "Thread1");
? ? ? ? Thread thread2 = new Thread(group, () -> {
? ? ? ? ? ? System.out.println(Thread.currentThread().getName() + " is running");
? ? ? ? }, "Thread2");
? ? ? ? thread1.start();
? ? ? ? thread2.start();
? ? ? ? System.out.println("Active threads in group: " + group.activeCount());
? ? }
}
```
#### 8.2 守護線程
守護線程(
Daemon Thread)是一種特殊的線程,它在后臺運行,用于完成一些輔助工作。當所有的非守護線程結束時,守護線程也會自動結束。
```java
public class Main {
? ? public static void main(String[] args) {
? ? ? ? Thread daemonThread = new Thread(() -> {
? ? ? ? ? ? while (true) {
? ? ? ? ? ? ? ? System.out.println("Daemon thread is running");
? ? ? ? ? ? ? ? try {
? ? ? ? ? ? ? ? ? ? Thread.sleep(1000);
? ? ? ? ? ? ? ? } catch (InterruptedException e) {
? ? ? ? ? ? ? ? ? ? e.printStackTrace();
? ? ? ? ? ? ? ? }
? ? ? ? ? ? }
? ? ? ? });
? ? ? ? daemonThread.setDaemon(true);
? ? ? ? daemonThread.start();
? ? ? ? try {
? ? ? ? ? ? Thread.sleep(3000);
? ? ? ? } catch (InterruptedException e) {
? ? ? ? ? ? e.printStackTrace();
? ? ? ? }
? ? ? ? System.out.println("Main thread is ending");
? ? }
}
```
### 9. 多線程編程中的注意事項
1. **避免死鎖**:確保鎖的獲取順序一致,使用超時機制避免死鎖。
2. **避免過度同步**:過度同步會降低程序性能,甚至導致死鎖。
3. **線程安全性**:使用線程安全的數據結構和工具類,如 `ConcurrentHashMap`、`CopyOnWriteArrayList` 等。
4. **合理使用線程池**:避免頻繁創建和銷毀線程,合理配置線程池大小。
### 10. 總結
多線程編程是 Java 中一個重要的組成部分,通過合理使用多線程,可以提高應用程序的性能和響應速度。Java 提供了豐富的類庫和工具,幫助開發者實現多線程程序,包括 `Thread` 類、`Runnable` 接口、`Callable` 接口、同步機制、線程池等。在多線程編程中,需要特別注意線程安全性、避免死鎖和過度同步等問題。通過深入理解和掌握這些概念和工具,可以編寫出高效、可靠的并發程序。