Java `Thread.run()`方法详解与实例分析

举报
yd_286102127 发表于 2024/11/26 20:25:47 2024/11/26
【摘要】 @[TOC](Java Thread.run()方法详解与实例分析) 博主 默语带您 Go to New World. ✍ 个人主页—— 默语 的博客👦🏻 优秀内容</ a>《java 面试题大全》</ a> 《java 专栏》</ a> 《idea技术专区》</ a> 《spring boot 技术专区》</ a> 《MyBatis从入门到精通》</ a> 《23种设计模式》</...

@[TOC](Java Thread.run()方法详解与实例分析)

在这里插入图片描述

博主 默语带您 Go to New World.
个人主页—— 默语 的博客👦🏻 优秀内容</ a>
《java 面试题大全》</ a>
《java 专栏》</ a>
《idea技术专区》</ a>
《spring boot 技术专区》</ a>
《MyBatis从入门到精通》</ a>
《23种设计模式》</ a>
《经典算法学习》</ a>
《spring 学习》</ a>
《MYSQL从入门到精通》</ a>数据库是开发者必会基础之一~
🍩惟余辈才疏学浅,临摹之作或有不妥之处,还请读者海涵指正。☕🍭
🪁 吾期望此文有资助于尔,即使粗浅难及深广,亦备添少许微薄之助。苟未尽善尽美,敬请批评指正,以资改进。!💻⌨


默语是谁?

大家好,我是 默语,别名默语博主,擅长的技术领域包括Java、运维和人工智能。我的技术背景扎实,涵盖了从后端开发到前端框架的各个方面,特别是在Java 性能优化、多线程编程、算法优化等领域有深厚造诣。

目前,我活跃在CSDN、掘金、阿里云和 51CTO等平台,全网拥有超过10万的粉丝,总阅读量超过1400 万。统一 IP 名称为 默语 或者 默语博主。我是 CSDN 博客专家、阿里云专家博主和掘金博客专家,曾获博客专家、优秀社区主理人等多项荣誉,并在 2023 年度博客之星评选中名列前 50。我还是 Java 高级工程师、自媒体博主,北京城市开发者社区的主理人,拥有丰富的项目开发经验和产品设计能力。希望通过我的分享,帮助大家更好地了解和使用各类技术产品,在不断的学习过程中,可以帮助到更多的人,结交更多的朋友.


我的博客内容涵盖广泛,主要分享技术教程、Bug解决方案、开发工具使用、前沿科技资讯、产品评测与使用体验。我特别关注云服务产品评测、AI 产品对比、开发板性能测试以及技术报告,同时也会提供产品优缺点分析、横向对比,并分享技术沙龙与行业大会的参会体验。我的目标是为读者提供有深度、有实用价值的技术洞察与分析。


Java Thread.run()方法详解与实例分析

摘要

在Java并发编程中,Thread.run() 是一个关键方法,很多初学者在使用时可能会感到迷惑:什么是 run() 方法?为什么我们需要它?与 start() 方法又有什么区别?本篇博客将从基础概念到实践实例,全方位剖析 java.lang.Thread.run() 方法,帮助你彻底掌握其用法与注意事项。


引言

为什么需要多线程?

多线程是现代程序设计中的重要概念。通过多线程,可以提升程序效率,优化资源利用。例如:当你在浏览网页时,同时可以下载文件、播放音乐,这就是多线程的实际应用。

在Java中,Thread 是实现多线程的核心类,而 run() 方法则是线程执行的核心逻辑部分。

本文目标

  1. 理解 Thread.run() 方法的作用
  2. 掌握正确的使用姿势
  3. 避免常见的错误用法

正文

一、Thread.run() 的作用与定义

方法定义

Thread.run()Thread 类中的实例方法,用于定义线程的具体任务。

public void run() {
    // 自定义线程逻辑
}

运行机制

  1. 当直接调用 run() 方法时:代码会在当前线程中执行,不会创建新的线程。
  2. 当通过 start() 调用时:JVM 会创建一个新的线程,并执行 run() 方法中的逻辑。

二、Thread.run() 和 Thread.start() 的区别

直接调用 run()

Thread thread = new Thread(() -> System.out.println("Running in main thread"));
thread.run();

输出

Running in main thread

此时,run() 方法是普通方法调用,代码运行在当前线程(通常是主线程)中。


通过 start() 调用

Thread thread = new Thread(() -> System.out.println("Running in new thread"));
thread.start();

输出

Running in new thread

此时,start() 会启动一个新线程,run() 方法的逻辑运行在新线程中。


三、实现线程的两种方式与 run() 方法

1. 继承 Thread

通过继承 Thread 类,重写 run() 方法来定义线程行为。

代码示例

class MyThread extends Thread {
    @Override
    public void run() {
        System.out.println("Thread is running...");
    }
}

public class Main {
    public static void main(String[] args) {
        MyThread thread = new MyThread();
        thread.start(); // 启动新线程
    }
}

输出

Thread is running...

2. 实现 Runnable 接口

通过实现 Runnable 接口的 run() 方法,传递给 Thread 对象。

代码示例

class MyRunnable implements Runnable {
    @Override
    public void run() {
        System.out.println("Thread is running...");
    }
}

public class Main {
    public static void main(String[] args) {
        Thread thread = new Thread(new MyRunnable());
        thread.start(); // 启动新线程
    }
}

输出

Thread is running...

优点:实现 Runnable 接口更灵活,可以避免多继承冲突。


四、常见误区与错误用法

1. 直接调用 run()

很多初学者会误以为调用 run() 方法等同于启动新线程。实际上,这只是普通方法调用。

错误示例

Thread thread = new Thread(() -> System.out.println("Mistake!"));
thread.run(); // 没有启动新线程

2. 重复调用 start()

start() 方法只能调用一次,重复调用会抛出异常。

错误示例

Thread thread = new Thread(() -> System.out.println("Running..."));
thread.start();
thread.start(); // 错误,不能重复启动

异常信息

java.lang.IllegalThreadStateException

3. 忘记重写 run()

如果未重写 run() 方法,线程不会执行任何自定义逻辑。

错误示例

Thread thread = new Thread();
thread.start(); // 没有自定义任务

五、实践:自定义线程任务

示例:并发下载模拟

多个线程模拟同时下载多个文件。

代码示例

class FileDownloader implements Runnable {
    private String fileName;

    public FileDownloader(String fileName) {
        this.fileName = fileName;
    }

    @Override
    public void run() {
        System.out.println("Downloading " + fileName + " in thread: " + Thread.currentThread().getName());
        try {
            Thread.sleep(2000); // 模拟下载耗时
        } catch (InterruptedException e) {
            System.out.println("Download interrupted for " + fileName);
        }
        System.out.println(fileName + " downloaded successfully!");
    }
}

public class Main {
    public static void main(String[] args) {
        Thread t1 = new Thread(new FileDownloader("File1.zip"));
        Thread t2 = new Thread(new FileDownloader("File2.zip"));
        Thread t3 = new Thread(new FileDownloader("File3.zip"));

        t1.start();
        t2.start();
        t3.start();
    }
}

输出(可能因线程调度不同而变化):

Downloading File1.zip in thread: Thread-0  
Downloading File2.zip in thread: Thread-1  
Downloading File3.zip in thread: Thread-2  
File1.zip downloaded successfully!  
File2.zip downloaded successfully!  
File3.zip downloaded successfully!  

总结

  • run() 方法:定义线程执行的任务。直接调用不会启动新线程。
  • start() 方法:真正启动新线程,调用 run()
  • 推荐使用 Runnable 接口:灵活性更高,适合多继承环境。
  • 避免常见误区:如直接调用 run() 或重复调用 start()

掌握了这些要点,你在使用 Java 多线程时将更加游刃有余!


参考资料


如果你还有关于 Thread.run() 的问题,或者对多线程编程感兴趣,欢迎添加我的微信 (微信号:Solitudemind),一起探讨学习吧! 😊

在这里插入图片描述


🪁🍁 希望本文能够给您带来一定的帮助🌸文章粗浅,敬请批评指正!🍁🐥

如对本文内容有任何疑问、建议或意见,请联系作者,作者将尽力回复并改进📓;(联系微信:Solitudemind )

点击下方名片,加入IT技术核心学习团队。一起探索科技的未来,共同成长。

在这里插入图片描述

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。