### 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` 接口、同步机制、线程池等。在多线程编程中,需要特别注意线程安全性、避免死锁和过度同步等问题。通过深入理解和掌握这些概念和工具,可以编写出高效、可靠的并发程序。