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