✅ Day 1:并发基础与线程机制


🔍 一、什么是并发和并行?

概念 解释 示例
并发(Concurrency) 多个任务在同一时间段交替执行 单核 CPU 多个任务切换
并行(Parallelism) 多个任务在同一时刻同时执行 多核 CPU 每个核一个线程

面试点:Java 是支持并发的语言,利用多线程模拟并发行为,但是否能并行,取决于 CPU 核数。


🧵 二、线程与进程的区别

比较点 线程(Thread) 进程(Process)
最小执行单元 否(进程可以包含多个线程)
内存空间 共享(如堆、方法区) 独立
开销
通信方式 共享变量、同步机制 Socket、管道等

👷 三、Java 中创建线程的三种方式

✅ 方法一:继承 Thread

1
2
3
4
5
6
class MyThread extends Thread {
@Override
public void run() {
System.out.println("线程运行:" + Thread.currentThread().getName());
}
}

✅ 方法二:实现 Runnable

1
2
3
4
5
class MyRunnable implements Runnable {
public void run() {
System.out.println("线程运行:" + Thread.currentThread().getName());
}
}

✅ 方法三:实现 Callable(有返回值 + 支持异常)

1
2
3
4
5
class MyCallable implements Callable<String> {
public String call() {
return "任务结果:" + Thread.currentThread().getName();
}
}

结合 FutureTask 使用:

1
2
3
4
Callable<String> task = new MyCallable();
FutureTask<String> future = new FutureTask<>(task);
new Thread(future).start();
System.out.println("返回值:" + future.get());

⚙️ 四、线程的基本方法(面试必问)

方法 说明
start() 启动线程,执行 run() 方法
sleep(ms) 线程休眠,不释放锁
yield() 让出 CPU 执行权,可能马上再次抢占
join() 等待某个线程执行完成
interrupt() 中断线程(配合 isInterrupted)

🧪 实战练习:多线程交替打印数字

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
public class PrintOddEven {
private static int count = 1;
private static final Object lock = new Object();

public static void main(String[] args) {
Runnable printOdd = () -> {
while (count < 10) {
synchronized (lock) {
if (count % 2 == 1) {
System.out.println("奇数:" + count++);
}
}
}
};

Runnable printEven = () -> {
while (count < 10) {
synchronized (lock) {
if (count % 2 == 0) {
System.out.println("偶数:" + count++);
}
}
}
};

new Thread(printOdd).start();
new Thread(printEven).start();
}
}

🎯 面试题精选(附答案简析)

  1. Runnable 和 Callable 的区别?
    • Runnable 无返回值、不能抛出异常;
    • Callable 有返回值、可抛出异常,结合 Future 使用。
  2. start() 和 run() 有什么区别?
    • start() 会创建新线程并调用 run()
    • run() 是普通方法,不会启动新线程。
  3. sleep 和 wait 的区别?
    • sleep()Thread 的方法,不释放锁;
    • wait()Object 的方法,释放锁并等待被唤醒。

📌 今日小结

  • 理解并发与并行的区别
  • 掌握 Java 中创建线程的三种方式
  • 理解线程的生命周期与基本方法
  • 掌握线程协作的基础操作(实战:交替打印)