当前位置: 代码网 > it编程>编程语言>Java > Java中实现线程的创建和启动的方法

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

2025年06月11日 Java 我要评论
1. 线程的生命周期java 线程有明确的生命周期状态:新建状态(new):创建 thread 对象后(如 new mythread()),线程尚未启动可运行状态(runnable):调用 start

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线程创建和启动内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!

(0)

相关文章:

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

发表评论

验证码:
Copyright © 2017-2025  代码网 保留所有权利. 粤ICP备2024248653号
站长QQ:2386932994 | 联系邮箱:2386932994@qq.com