it编程 > 编程语言 > Java

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

10人参与 2025-06-11 Java

1. 线程的生命周期

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

关键点:只有调用 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 会:

(2) 异步执行

(3) 线程调度控制

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

(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实现的本地方法

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() 才能

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

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

(0)

您想发表意见!!点此发布评论

推荐阅读

MyBatis ResultMap 的基本用法示例详解

06-11

MyBatis-Plus 条件构造器Wrapper使用示例详解(最新整理)

06-11

Mybatis Plus Join使用方法示例详解

06-11

MybatisPlus service接口功能介绍

06-11

Mybatis的分页实现方式

06-11

MyBatis Plus 中 update_time 字段自动填充失效的原因分析及解决方案(最新整理)

06-11

猜你喜欢

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论