进程
定义
进程 是操作系统分配资源的基本单位,是程序的一次执行过程
每个进程都有独立的内存空间、文件描述符、环境变量等资源
进程之间相互隔离,一个进程崩溃不会影响其他进程
特点
独立性:每个进程有独立的内存空间和资源
隔离性:进程之间通过进程间通信(IPC)机制进行交互
资源开销大:创建和销毁进程的开销较大,因为需要分配和回收独立的内存空间和资源
线程
定义
线程 是进程中的一个执行单元,是 CPU 调度的基本单位
一个进程可以包含多个线程,这些线程共享进程的内存空间和资源
线程之间可以直接访问共享数据,但也需要同步机制来避免竞争条件
特点
共享资源:线程共享进程的内存空间和资源
轻量级:创建和销毁线程的开销较小
并发性:线程可以并发执行,提高程序的执行效率
线程常用方法
Thread.currentThread():获取当前线程对象
Object.getName() 和 setName(String name),获取或设置线程的名称
Thread thread = new Thread(() -> {
System.out.println("Thread name: " + Thread.currentThread().getName());
});
thread.setName("MyThread");
thread.start();
Object.getPriority() 和 setPriority(int priority)
优先级范围:1(最低)到 10(最高),默认优先级为 5
特点:优先级高的线程有更大的机会获得 CPU 时间片
Thread thread = new Thread(() -> {
System.out.println("Thread priority: " + Thread.currentThread().getPriority());
});
thread.setPriority(Thread.MAX_PRIORITY); // 设置最高优先级
thread.start();
Thread.sleep(long millis),让当前线程暂停执行指定的时间(毫秒)
不会释放锁
可能会被中断,抛出 InterruptedException
try {
Thread.sleep(1000); // 暂停 1 秒
} catch (InterruptedException e) {
e.printStackTrace();
}
Object.join(),让当前线程等待目标线程终止
可以设置超时时间(如 join(long millis))
可能会被中断,抛出 InterruptedException
Thread thread = new Thread(() -> {
System.out.println("Thread is running.");
});
thread.start();
thread.join(); // 当前线程等待,等待插入的线程终止
System.out.println("Thread is done.");
Object.interrupt(),中断目标线程
如果线程处于 wait()、sleep() 或 join() 状态,会抛出 InterruptedException
可以通过 isInterrupted() 检查线程的中断状态
对于正在运行中的线程,interrupt() 仅设置中断标志位,不会直接停止线程。需要线程主动检查中断状态(如通过 isInterrupted() 或 Thread.interrupted() )并终止任务
线程处于阻塞状态(如 sleep()、wait()、join()),调用 interrupt() 会触发 InterruptedException 异常,线程可以通过捕获该异常退出阻塞状态
Thread thread = new Thread(() -> {
while (!Thread.currentThread().isInterrupted()) {
System.out.println("Thread is running.");
}
System.out.println("Thread is interrupted.");
});
thread.start();
Thread.sleep(1000);
thread.interrupt(); // 中断线程
守护线程
守护线程(Daemon Thread)是 Java 中一种特殊类型的线程,主要作用是为其他线程(用户线程)提供后台支持服务
当所有用户线程结束时,无论守护线程是否执行完成,JVM 都会自动终止守护线程并退出
默认优先级较低
不会阻止 JVM 退出,常用于执行非关键任务(如垃圾回收、日志记录等)
用Object.setDaemon(true)设置线程为守护线程,必须在调用 start() 方法前设置
Thread daemonThread = new Thread(() -> {
while (true) {
System.out.println(" 守护线程运行中...");
try { Thread.sleep(1000); }
catch (InterruptedException e) { e.printStackTrace(); }
}
});
daemonThread.setDaemon(true); // 必须在 start() 前调用
daemonThread.start();
并发
定义
并发 是指多个任务在同一时间段内交替执行,从宏观上看似乎是同时进行的,但实际上是通过快速切换任务来实现的
并发通常用于提高系统的响应性和资源利用率
单核 CPU 上的多任务处理:通过操作系统的任务调度,快速切换多个任务,实现并发执行
特点
任务交替执行:多个任务在同一时间段内交替执行,但某一时刻只有一个任务在运行
适用于 I/O 密集型任务:并发适合处理需要等待 I/O 操作(如文件读写、网络请求)的任务
实现方式
多线程:通过创建多个线程来实现并发
事件驱动:通过事件循环和回调函数来实现并发
并行
定义
并行 是指多个任务在同一时刻同时执行,通常需要多核 CPU 或分布式系统的支持
并行通常用于提高系统的计算性能
特点
任务同时执行:多个任务在同一时刻同时执行
提高计算性能:通过同时执行多个任务,可以显著提高计算速度
适用于 CPU 密集型任务:并行适合处理需要大量计算的任务
实现方式
多核 CPU:通过多核 CPU 同时执行多个线程或进程
分布式系统:通过多台计算机同时执行任务