Java 多线程基础入门——从创建到控制
- 学习多线程原因
当程序需要同时下载文件、播放音乐并响应用户点击。如果只用单线程,这些任务必须排队执行,用户体验会极差。多线程技术允许程序“一心多用”,充分利用 CPU 资源,实现真正的并发处理。
- 开启新世界的钥匙:创建线程
在 Java 中,启动一个新线程主要有两种经典姿势:
方式一:继承 Thread 类
这是最直观的方法。你只需要创建一个类继承 Thread ,并重写它的 run() 方法。
class MyThread extends Thread {
@Override
public void run() {
// 这里写线程要执行的代码
System.out.println("我是通过继承 Thread 创建的线程:" + getName());
}
}
// 启动方式
MyThread t = new MyThread();
t.start(); // 注意:必须调用 start(),不能直接调用 run()
方式二:实现 Runnable 接口
这种方式更灵活,因为它避免了 Java 单继承的限制。如果你的类已经继承了其他父类,就只能用这种方式。
class MyRunnable implements Runnable {
@Override
public void run() {
System.out.println("我是通过实现 Runnable 创建的线程");
}
}
// 启动方式
Thread t = new Thread(new MyRunnable());
t.start();
避坑指南:千万不要直接调用 t.run() !那只是普通的方法调用,不会开启新线程。只有 t.start() 才会通知 JVM 为你分配资源并启动线程。
-
线程的“生老病死”:生命周期
线程并不是创建后就一直运行的,它有自己的生命周期:
新建状态 (New): new Thread() 之后,线程对象已创建,但还没启动。
就绪状态 (Runnable):调用 start() 后,线程进入就绪队列,等待 CPU 调度。
运行状态 (Running):CPU 选中了该线程,开始执行 run() 方法中的代码。
阻塞状态 (Blocked/Waiting):
调用了 sleep() :主动休息一段时间。
调用了 wait() :等待被唤醒(常用于线程通信)。
等待 I/O 或锁:被动等待资源。
死亡状态 (Dead): run() 方法执行完毕,或者因异常退出,线程结束。 -
常用控制方法速查表
为了让线程听话,我们需要掌握几个关键指令:
设置名字: setName("下载线程") / getName() —— 方便调试时区分是谁在干活。
休眠: Thread.sleep(1000) —— 让当前线程暂停 1 秒,交出 CPU 使用权。
加入: join() —— “插队”功能。如果在主线程中调用 t.join() ,主线程会等待 t 执行完才继续。
礼让: yield() —— 提示调度器“我可以先让别人跑”,但不保证一定生效。
更多推荐



所有评论(0)