✅ 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(); } }
|
🎯 面试题精选(附答案简析)
- Runnable 和 Callable 的区别?
- Runnable 无返回值、不能抛出异常;
- Callable 有返回值、可抛出异常,结合 Future 使用。
- start() 和 run() 有什么区别?
start()
会创建新线程并调用 run()
;
run()
是普通方法,不会启动新线程。
- sleep 和 wait 的区别?
sleep()
是 Thread
的方法,不释放锁;
wait()
是 Object
的方法,释放锁并等待被唤醒。
📌 今日小结
- 理解并发与并行的区别
- 掌握 Java 中创建线程的三种方式
- 理解线程的生命周期与基本方法
- 掌握线程协作的基础操作(实战:交替打印)