目录
一 . 进程与线程
1. 基本概念
(博哥有话说:注意进程与线程的区别)
进程(Process):
-
操作系统资源分配的基本单位
-
拥有独立的内存空间(堆、栈、方法区)
-
进程间通信(IPC)成本较高(管道、消息队列、共享内存等)
线程(Thread):
-
CPU调度的基本单位
-
共享进程的内存资源(堆、方法区),但有独立的栈空间
-
线程间通信成本较低(可直接访问共享变量)
2. Java中的线程实现
-
用户级线程:早期Java的"绿色线程",完全由JVM管理
-
内核级线程:现代Java采用,1:1映射到操作系统线程
-
提高资源利用率
-
提高系统吞吐量
-
改善用户体验(如GUI程序)
二、线程的创建与控制方法
1. 创建线程的三种方式
(博哥有话说:这三种基本创建线程的方法要知道)
(1) 继承Thread类
class MyThread extends Thread {
@Override
public void run() {
System.out.println("Thread running");
}
}
// 使用
new MyThread().start();
(2) 实现Runnable接口
class MyRunnable implements Runnable {
@Override
public void run() {
System.out.println("Runnable running");
}
}
// 使用
new Thread(new MyRunnable()).start();
(3) 实现Callable接口(可获取返回值)
class MyCallable implements Callable<String> {
@Override
public String call() throws Exception {
return "Callable result";
}
}
// 使用
FutureTask<String> task = new FutureTask<>(new MyCallable());
new Thread(task).start();
System.out.println(task.get()); // 获取返回值
2. 线程控制方法
方法 | 说明 | 注意 |
---|---|---|
start() | 启动线程 | 只能调用一次 |
run() | 线程执行体 | 直接调用只是普通方法 |
sleep(long millis) | 线程休眠 | 不释放锁 |
yield() | 让出CPU | 不一定立即生效 |
join() | 等待线程结束 | 常用于线程协作 |
interrupt() | 中断线程 | 只是设置标志位 |
setDaemon(boolean) | 设为守护线程 | 需在start前调用 |
三、线程同步与死锁
(博哥有话说:线程的同步与死锁多在操作系统里讲述)
1. 同步的必要性
-
解决竞态条件(Race Condition)
-
保证可见性(一个线程的修改对其他线程可见)
-
维护原子性(操作不可分割)
2. 死锁产生的四个必要条件
-
互斥条件:资源一次只能被一个线程占用
-
占有且等待:线程持有资源并等待其他资源
-
不可抢占:资源只能由持有线程释放
-
循环等待:多个线程形成等待环路
3. 死锁避免策略
-
破坏占有且等待:一次性申请所有资源
-
破坏不可抢占:设置超时尝试获取锁
-
破坏循环等待:按固定顺序获取资源
-
使用
tryLock()
尝试获取锁 -
使用工具检测(如jstack)