文章目录
一、进程和线程
1. 进程
进程是程序在操作系统中的一次运行实例,是操作系统资源分配的基本单位。每个进程都有独立的内存空间和数据资源。
2. 线程
线程是进程中的一个执行单元,也是CPU 调度的最小单位。同一进程中的多个线程共享进程的内存空间、数据资源等,多个线程可以在单个 CPU 上快速切换执行。
二、并发和并行
1. 并发
- 在同一时间段内,多个任务交替执行。
- 可能运行在单核 CPU(时间片轮转) 或 多核 CPU(多个线程切换)。
2. 并行
- 在同一时刻,多个任务真正同时执行。
- 必须运行在 多核 CPU 上,每个核心独立运行不同的任务。
三、线程的创建方式
1. 继承 Thread 类
public class MyThread extends Thread {
@Override
public void run() {
System.out.println(Thread.currentThread().getName());
}
}
public class ThreadDemo {
public static void main(String[] args) {
MyThread thread1 = new MyThread();
thread1.start();
}
}
2. 实现 Runnable 接口
public class MyRunnable implements Runnable {
@Override
public void run() {
System.out.println(Thread.currentThread().getName());
}
}
public class ThreadDemo {
public static void main(String[] args) {
MyRunnable myRunnable = new MyRunnable();
Thread thread1 = new Thread(myRunnable);
thread1.start();
}
}
3. 使用 Callable 接口
public class MyCallable implements Callable<Integer> {
@Override
public Integer call() {
int sum = 0;
for (int i = 0; i < 100; i++) {
sum += i;
}
return sum;
}
}
public class ThreadDemo {
public static void main(String[] args) throws Exception {
MyCallable mc = new MyCallable();
FutureTask<Integer> futureTask = new FutureTask<>(mc);
Thread t1 = new Thread(futureTask);
t1.start();
// 获取线程执行结果
try {
Integer result = futureTask.get();
System.out.println("result = " + result);
} catch (Exception e) {
e.printStackTrace();
}
}
}
四、线程的生命周期
状态 | 说明 |
---|---|
NEW(新建) | 线程被创建,但未调用 start() |
RUNNABLE(可运行) | 线程调用 start() 后,可能正在运行,也可能在等待 CPU 调度 |
BLOCKED(阻塞) | 线程等待获取锁,未能成功获取,进入阻塞状态 |
WAITING(无限等待) | 线程调用 wait() 或 join(),需要其他线程显式唤醒 |
TIMED_WAITING(限时等待) | 线程调用 sleep()、wait(timeout),等待超时后自动恢复 |
TERMINATED(终止) | 线程执行完毕或发生异常,彻底结束 |
五、线程常用方法解析
方法 | 作用 | 影响 |
---|---|---|
sleep(long millis) | 让当前线程休眠指定时间 | 线程进入 TIMED_WAITING 状态 |
yield() | 让出 CPU 资源,回到就绪状态 | 线程从 RUNNING 进入 RUNNABLE |
join() | 等待该线程执行完毕 | 调用线程进入 WAITING 状态 |
setDaemon(true) | 设置守护线程 | 线程随主线程结束而结束 |
currentThread() | 获取当前执行线程 | 返回当前线程对象 |
start() | 启动线程,进入就绪状态 | 线程进入 RUNNABLE |
run() | 线程的执行逻辑 | 只是普通方法调用,不启动新线程 |
wait() | 让当前线程进入等待状态,直到被唤醒 | 线程进入 WAITING |
notify() | 唤醒一个 wait() 的线程 | 该线程去竞争锁,可能导致线程竞争 |
notifyAll() | 唤醒所有 wait() 的线程 | 避免线程被永久阻塞 |