多线程(Multi-threading) 是指在一个程序中同时运行多个执行线程的技术。每个线程都是程序中的一个独立执行路径,可以并发执行不同的任务。对于希望提升程序性能、充分利用多核CPU能力的Java开发者来说,掌握多线程是必经之路。关于并发编程的更多系统性讨论,可以在云栈社区的后端与架构板块找到丰富的资源。

上图清晰地展示了普通方法调用与多线程执行的核心区别。调用 run() 方法只是普通的方法执行,仍在主线程的单一执行路径上;而调用 start() 方法则会启动一个新的线程,与主线程并行交替执行,从而形成多条执行路径。理解这一点是进入Java并发世界的第一步。
案例一:通过继承Thread类创建多线程
在Java中,创建线程最经典的方式之一就是继承 Thread 类。具体步骤如下:
- 自定义一个线程类,并让它继承
Thread 类。
- 重写
Thread 类中的 run() 方法,将需要并发执行的代码逻辑(线程体)写在这个方法里。
- 创建自定义线程类的对象,并调用其
start() 方法来启动线程。
下面是一个完整的代码示例:
package Thread;
//创建一个线程方式一:继承Thread类,重写run()方法,调用start开启线程
//注意:线程开启不一定立即执行,由CPU调度执行
public class TestThread extends Thread{
@Override
public void run() {
//run方法线程体
for(int i=0;i<200;i++){
System.out.println("我在看代码----"+i);
}
}
public static void main(String[] args) {
//main线程,主线程
//创建一个线程对象
TestThread testThread = new TestThread();
//调用start()方法开启线程
testThread.start();
for(int i=0;i<200;i++){
System.out.println("我在学习多线程--"+i);
}
}
}
运行这段代码,你会发现控制台输出的“我在看代码----”和“我在学习多线程--”是交替出现的,这就是主线程和新创建的子线程在并发执行。请务必记住:调用 start() 方法后,线程进入就绪状态,具体的执行时机由操作系统CPU调度器决定,并非立即运行。
线程核心概念
理解了如何创建线程后,我们还需要掌握一些基础但至关重要的核心概念,它们是理解和运用Java多线程的基石:
- 线程就是独立的执行路径;
- 在程序运行时,即使没有自己创建线程,后台也会有多个线程,如主线程,gc线程;
main() 称之为主线程,为系统的入口,用于执行整个程序;
- 在一个进程中,如果开辟了多个线程,线程的运行由调度器安排调度,调度器是与操作系统紧密相关的,先后顺序是不能人为的干预的。
- 对同一份资源操作时,会存在资源抢夺的问题,需要加入并发控制;
- 线程会带来额外的开销,如cpu调度时间,并发控制开销。
- 每个线程在自己的工作内存交互,内存控制不当会造成数据不一致
简单来说,多线程编程不仅仅是“同时做多件事”,它更涉及到资源管理、执行顺序的不确定性以及数据安全等复杂问题。从继承 Thread 类开始,逐步深入到 Runnable、Callable 接口以及 JUC 工具包,你会建立起一套完整的并发编程知识体系。
|