1. 学习多线程原因

当程序需要同时下载文件、播放音乐并响应用户点击。如果只用单线程,这些任务必须排队执行,用户体验会极差。多线程技术允许程序“一心多用”,充分利用 CPU 资源,实现真正的并发处理。

  1. 开启新世界的钥匙:创建线程

在 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 为你分配资源并启动线程。

  1. 线程的“生老病死”:生命周期
    线程并不是创建后就一直运行的,它有自己的生命周期:
    新建状态 (New): new Thread()  之后,线程对象已创建,但还没启动。
    就绪状态 (Runnable):调用  start()  后,线程进入就绪队列,等待 CPU 调度。
    运行状态 (Running):CPU 选中了该线程,开始执行  run()  方法中的代码。
    阻塞状态 (Blocked/Waiting):
    调用了  sleep() :主动休息一段时间。
    调用了  wait() :等待被唤醒(常用于线程通信)。
    等待 I/O 或锁:被动等待资源。
    死亡状态 (Dead): run()  方法执行完毕,或者因异常退出,线程结束。

  2. 常用控制方法速查表

为了让线程听话,我们需要掌握几个关键指令:
设置名字: setName("下载线程")  /  getName()  —— 方便调试时区分是谁在干活。
休眠: Thread.sleep(1000)  —— 让当前线程暂停 1 秒,交出 CPU 使用权。
加入: join()  —— “插队”功能。如果在主线程中调用  t.join() ,主线程会等待  t  执行完才继续。
礼让: yield()  —— 提示调度器“我可以先让别人跑”,但不保证一定生效。

Logo

汇聚全球AI编程工具,助力开发者即刻编程。

更多推荐