多线程编程
理解线程与进程的区别
掌握两种创建线程的方式
了解线程状态与常用方法
核心讲解
(1)基本概念
进程:运行中的程序,独立资源,一个进程可以有多个线程
线程:CPU 调度的最小单位,共享进程资源
并发:宏观同时执行,微观轮流执行
并行:真正同时执行,多核 CPU
(2)创建线程的两种方式
继承 Thread 类
继承 Thread,重写 run () 方法
创建对象,调用 start () 启动
实现 Runnable 接口
实现 Runnable,重写 run ()
封装成 Thread 对象,start () 启动
推荐:解耦,还可以继承其他类
(3)线程常用方法
start():启动线程run():线程执行体,不要直接调用sleep(毫秒):休眠join():等待线程结束currentThread():获取当前线程对象getName():获取线程名
(4)线程状态
新建 → 就绪 → 运行 → 阻塞 → 死亡
代码示例
public class ThreadDemo {
public static void main(String[] args) throws InterruptedException {
// ===== 方式1:继承Thread =====
class MyThread extends Thread {
@Override
public void run() {
for (int i = 0; i < 5; i++) {
System.out.println(getName() + ":" + i);
try {
Thread.sleep(500);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
// ===== 方式2:实现Runnable(推荐) =====
Runnable task = () -> {
for (int i = 0; i < 5; i++) {
System.out.println(Thread.currentThread().getName() + ":" + i);
try {
Thread.sleep(500);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
};
// 启动线程
Thread t1 = new MyThread();
Thread t2 = new Thread(task, "线程2");
t1.start();
t2.start();
// 主线程等待两个线程结束
t1.join();
t2.join();
System.out.println("所有线程执行完毕");
}
}
常见误区
run 和 start 搞混:start 才是启动线程,run 只是普通方法调用,不会开新线程
线程安全问题:多个线程同时修改共享变量,会出现数据错乱,需要加锁
多次 start:一个线程只能 start 一次,多次调用会报错
sleep 释放锁:sleep 不会释放锁,wait 才会释放
课后练习
用两种方式分别创建线程,打印 1-5
启动两个线程,同时循环计数,观察交替执行
实现:主线程等待子线程全部执行完再结束
思考:为什么推荐用 Runnable 而不是继承 Thread?

