Java中实现线程的创建和启动的方法

 更新时间:2025年06月11日 11:41:13   作者:六七_Shmily  
在 Java 中,实现线程的创建和启动是两个不同但紧密相关的概念,理解为什么要启动线程(调用 start() 方法)而非直接调用 run() 方法,是掌握多线程编程的关键,本文给大家详细介绍了Java线程创建和启动的方法,需要的朋友可以参考下

1. 线程的生命周期

Java 线程有明确的生命周期状态:

  • 新建状态(New):创建 Thread 对象后(如 new MyThread()),线程尚未启动
  • 可运行状态(Runnable):调用 start() 后,线程进入就绪队列
  • 运行状态(Running):线程获得 CPU 时间片,执行 run() 方法
  • 终止状态(Terminated):run() 执行完毕

关键点:只有调用 start() 才能使线程从 New 进入 Runnable 状态!

2. start() vs run() 的本质区别

方法工作方式线程数量执行位置
start()JVM 创建新线程并执行 run()新线程独立调用栈
run()直接调用普通方法当前线程当前线程调用栈

错误示例

Thread thread = new Thread(() -> System.out.println("执行中"));
thread.run();  // 错误!在主线程同步执行

正确示例

thread.start(); // 正确!启动新线程异步执行

3. 为什么必须通过 start() 启动线程?

(1) 资源分配

调用 start() 时,JVM 会:

  • 为线程分配独立调用栈(Stack)
  • 注册线程到系统调度器
  • 触发操作系统级别的线程创建

(2) 异步执行

  • start() 使任务在后台异步执行,不阻塞当前线程
  • 直接调用 run() 会同步执行,阻塞当前线程

(3) 线程调度控制

只有通过 start() 启动的线程才能被:

  • 线程调度器管理(优先级、时间片分配)
  • 正确响应中断(interrupt()
  • 加入线程池统一管理

(4) 状态合规性

多次调用 start() 会抛出 IllegalThreadStateException,而 run() 可重复调用。这保证了线程状态机的正确性。

4. 底层机制

当调用 start() 时:

public synchronized void start() {
    if (threadStatus != 0)  // 检查状态是否为NEW
        throw new IllegalThreadStateException();
    
    group.add(this);  // 加入线程组
    
    boolean started = false;
    try {
        start0();  // 关键!调用本地方法
        started = true;
    } finally {
        // ...错误处理
    }
}

private native void start0();  // JVM实现的本地方法
  • start0() 是 native 方法,由 JVM 通过操作系统 API 创建真实线程
  • 新线程创建后自动执行 run() 方法

5. 实际应用场景

假设需要同时下载3个文件:

// 错误方式(顺序下载)
new DownloadTask("url1").run(); // 阻塞主线程
new DownloadTask("url2").run(); // 等待前一个完成
new DownloadTask("url3").run();

// 正确方式(并行下载)
new Thread(new DownloadTask("url1")).start(); // 异步
new Thread(new DownloadTask("url2")).start(); // 异步
new Thread(new DownloadTask("url3")).start(); // 异步

结论

操作结果是否启动线程
new Thread()创建线程对象(NEW状态)
start()启动线程(进入RUNNABLE状态)
run()普通方法调用

必须调用 start() 才能

  • 创建真正的操作系统线程
  • 实现任务异步执行
  • 符合线程生命周期规范
  • 利用多核CPU实现并行计算

直接调用 run() 只是普通方法调用,完全违背了多线程的设计目的!

到此这篇关于Java中实现线程的创建和启动的方法的文章就介绍到这了,更多相关Java线程创建和启动内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • java实现附件预览(openoffice+swftools+flexpaper)实例

    java实现附件预览(openoffice+swftools+flexpaper)实例

    本篇文章主要介绍了java实现附件预览(openoffice+swftools+flexpaper)实例,具有一定的参考价值,感兴趣的小伙伴们可以参考一下。
    2016-10-10
  • Java编程基础测试题分享

    Java编程基础测试题分享

    这篇文章主要介绍了Java编程基础测试题分享,具有一定参考价值,需要的朋友可以了解下。
    2017-10-10
  • 基于jdbc处理Clob的使用介绍

    基于jdbc处理Clob的使用介绍

    本篇文章是对jdbc处理Clob的使用进行了分析介绍,需要的朋友参考下
    2013-05-05
  • java获取键盘输入的数字,并进行排序的方法

    java获取键盘输入的数字,并进行排序的方法

    今天小编就为大家分享一篇java获取键盘输入的数字,并进行排序的方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-07-07
  • 浅谈关于Java的GC垃圾回收器的一些基本概念

    浅谈关于Java的GC垃圾回收器的一些基本概念

    这篇文章主要介绍了关于Java的GC垃圾回收器的一些基本概念,牵扯倒JVM内存模型的一些知识,需要的朋友可以参考下
    2015-11-11
  • Java读取Oracle大字段数据(CLOB)的2种方法

    Java读取Oracle大字段数据(CLOB)的2种方法

    这篇文章主要介绍了Java读取Oracle大字段数据(CLOB)的2种方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-04-04
  • Java WebService技术详解

    Java WebService技术详解

    本文详细讲解了Java WebService技术工作原理以及调用方式。对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-12-12
  • Java中csv文件读写超详细分析

    Java中csv文件读写超详细分析

    CSV是一种通用的、相对简单的文件格式,其文件以纯文本形式存储表格数据,下面这篇文章主要给大家介绍了关于Java中csv文件读写分析的相关资料,文中通过实例代码介绍的非常详细,需要的朋友可以参考下
    2023-05-05
  • SpringCloud Alibaba Seata (收藏版)

    SpringCloud Alibaba Seata (收藏版)

    Seata是一款开源的分布式事务解决方案,致力于在微服务架构在提供高性能和简单一样的分布式事务服务。这篇文章主要介绍了SpringCloud Alibaba Seata 的相关知识,需要的朋友可以参考下
    2020-10-10
  • Java基础之隐式转换vs强制转换

    Java基础之隐式转换vs强制转换

    这篇文章主要介绍了Java基础之隐式转换vs强制转换的相关资料,需要的朋友可以参考下
    2015-12-12

最新评论