第六章:多线程与并发
6.1 线程基础
6.1.1 什么是线程?
线程(Thread)是程序执行的最小单元,是操作系统能够进行运算调度的最小单位。一个进程可以包含多个线程,这些线程共享进程的资源(如内存空间、文件句柄等),但每个线程拥有独立的程序计数器、栈和局部变量。
6.1.2 线程与进程的区别
- 进程:操作系统分配资源的基本单位,每个进程拥有独立的内存空间和系统资源。
- 线程:进程内的执行单元,多个线程共享进程的资源,线程间的切换开销比进程小。
6.1.3 线程的优势
- 提高程序响应性:多线程允许程序在等待I/O操作时执行其他任务。
- 充分利用多核CPU:多线程可以并行执行,提高CPU利用率。
- 简化复杂任务:将任务分解为多个线程可以简化编程模型。
6.1.4 Java中的线程模型
Java通过java.lang.Thread类和java.lang.Runnable接口支持多线程编程。线程的创建和启动方式有两种:
- 继承Thread类:
class MyThread extends Thread { @Override public void run() { System.out.println("Thread is running"); } } MyThread thread = new MyThread(); thread.start(); - 实现Runnable接口:
class MyRunnable implements Runnable { @Override public void run() { System.out.println("Runnable is running"); } } Thread thread = new Thread(new MyRunnable()); thread.start();
6.1.5 线程的基本操作
- 启动线程:调用
start()方法,线程进入就绪状态。 - 线程休眠:使用
Thread.sleep(millis)让线程暂停执行。 - 线程中断:通过
interrupt()方法请求终止线程。 - 等待线程结束:调用
join()方法等待线程执行完成。
6.1.6 线程的状态
Java线程的生命周期包括以下状态:
- NEW:线程被创建但未启动。
- RUNNABLE:线程正在运行或等待CPU资源。
- BLOCKED:线程等待获取锁。
- WAITING:线程无限期等待其他线程的通知。
- TIMED_WAITING:线程在指定时间内等待。
- TERMINATED:线程执行完毕。
6.1.7 线程的优先级
Java线程的优先级范围为1(最低)到10(最高),默认优先级为5。可以通过setPriority(int priority)方法设置优先级,但实际调度取决于操作系统。
6.1.8 守护线程
守护线程(Daemon Thread)是为其他线程提供服务的线程,当所有非守护线程结束时,守护线程会自动终止。通过setDaemon(true)方法设置。
Thread daemonThread = new Thread(() -> {
while (true) {
System.out.println("Daemon thread running");
}
});
daemonThread.setDaemon(true);
daemonThread.start();
6.1.9 线程的注意事项
- 线程安全问题:多个线程共享数据时可能导致数据不一致。
- 避免过度创建线程:线程的创建和销毁需要开销,建议使用线程池。
- 避免死锁:多个线程互相等待对方释放锁时会导致死锁。
以上是线程基础的核心内容,后续章节将深入探讨线程的生命周期、同步机制和并发工具类。
