在Java中如何使用Runnable接口创建线程

来源:站长论坛作者:上海GEO公司头衔:草根站长
导读:本期聚焦于小伙伴创作的《在Java中如何使用Runnable接口创建线程》,敬请观看详情,探索知识的价值。以下视频、文章将为您系统阐述其核心内容与价值。如果您觉得《在Java中如何使用Runnable接口创建线程》有用,将其分享出去将是对创作者最好的鼓励。

在Java中,使用Runnable接口创建线程是一种灵活且常用的多线程实现方式,它避免了直接继承Thread类带来的单继承限制,更适合需要复用代码或者实现多接口的场景。这种方式的核心是将线程要执行的任务逻辑和线程本身的生命周期管理分离,让代码结构更加清晰。

在Java中如何使用Runnable接口创建线程

Runnable接口的基本定义

Runnable是Java标准库中的一个函数式接口,位于java.lang包下,它的定义非常简单,只包含一个无参数无返回值的run方法,源码结构如下:

// Runnable接口源码定义
@FunctionalInterface
public interface Runnable {
    // 线程执行的核心逻辑方法,需要由实现类重写
    public abstract void run();
}

我们只需要实现这个接口,重写run方法,把线程需要执行的任务代码写在run方法中即可。

使用Runnable接口创建线程的步骤

步骤一:定义Runnable接口的实现类

首先需要创建一个类实现Runnable接口,并重写run方法,在run方法中编写线程要执行的具体业务逻辑。如果是Java 8及以上版本,也可以使用lambda表达式来简化实现,不需要单独定义实现类。

步骤二:创建实现类的实例

实例化刚才定义的Runnable实现类,得到任务对象。

步骤三:将任务对象传入Thread构造器

Thread类提供了接收Runnable类型参数的构造方法,我们把任务对象作为参数传入,创建Thread实例,这个Thread实例就关联了我们要执行的任务。

步骤四:调用Thread的start方法启动线程

注意不能直接调用Runnable的run方法,那样只是在当前线程中执行普通方法,不会启动新线程,必须调用Thread实例的start方法,才会真正创建新的线程并执行run方法中的逻辑。

完整代码示例

下面给出一个完整的示例,分别展示使用实现类方式和lambda方式创建线程的写法:

public class RunnableThreadDemo {
    public static void main(String[] args) {
        // 方式一:使用自定义实现类
        // 定义Runnable实现类
        class MyRunnable implements Runnable {
            @Override
            public void run() {
                for (int i = 0; i < 3; i++) {
                    System.out.println("自定义实现类线程执行:" + i);
                    try {
                        // 让线程休眠100毫秒,方便观察执行顺序
                        Thread.sleep(100);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
            }
        }
        // 创建Runnable实例
        MyRunnable myRunnable = new MyRunnable();
        // 创建Thread对象并传入任务
        Thread thread1 = new Thread(myRunnable);
        // 启动线程
        thread1.start();

        // 方式二:使用lambda表达式(Java 8+)
        Thread thread2 = new Thread(() -> {
            for (int i = 0; i < 3; i++) {
                System.out.println("lambda方式线程执行:" + i);
                try {
                    Thread.sleep(100);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        });
        // 启动线程
        thread2.start();

        // 主线程的逻辑
        for (int i = 0; i < 3; i++) {
            System.out.println("主线程执行:" + i);
            try {
                Thread.sleep(100);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }
}

运行上面的代码,你会看到三个线程(两个子线程加主线程)的执行输出是交替的,说明新线程确实被成功启动并和主线程并发执行。

Runnable方式和继承Thread方式的区别

很多开发者会疑惑两种方式该怎么选,下面通过表格对比两者的核心差异:

对比维度实现Runnable接口继承Thread类
继承限制没有单继承限制,还可以实现其他接口受单继承限制,不能再继承其他类
任务分离任务和线程生命周期分离,更符合面向对象设计任务和线程耦合在一起
资源共享同一个Runnable实例可以传给多个Thread,方便共享资源需要静态变量才能实现资源共享,不够灵活
使用复杂度步骤稍多,但Java 8后lambda可简化步骤简单,直接重写run方法即可

注意事项

  • 不要直接调用Runnable的run方法,只有调用Thread的start方法才会启动新线程,直接调用run方法只是在当前线程执行普通方法。
  • 同一个Runnable实例可以传给多个Thread对象,多个线程会共享同一个Runnable实例的成员变量,如果需要线程隔离,要注意变量的作用域。
  • run方法不能抛出受检异常,如果有需要处理的异常,必须在run方法内部用try-catch捕获,不能声明在方法上抛出。
  • 线程的启动顺序不代表执行顺序,线程的执行由操作系统调度决定,每次运行的输出顺序可能不同。
总结来说,在Java中使用Runnable接口创建线程的步骤很清晰,先实现run方法定义任务,再把任务传给Thread对象启动即可。这种方式扩展性更好,是实际开发中的推荐选择,尤其是在需要线程共享资源或者避免单继承限制的场景下。

JavaRunnable接口线程创建多线程run方法修改时间:2026-06-30 01:48:41

免责声明:​ 已尽一切努力确保本网站所含信息的准确性。网站内容多为原创整理与精心编撰,观点力求客观中立。本站旨在免费分享,内容仅供个人学习、研究或参考使用。若引用了第三方作品,版权归原作者所有。如内容涉及您的权益,请联系我们处理。
内容垂直聚焦
专注技术核心技术栏目,确保每篇文章深度聚焦于实用技能。从代码技巧到架构设计,为用户提供无干扰的纯技术知识沉淀,精准满足专业提升需求。
知识结构清晰
覆盖从开发到部署的全链路。AI、前端、编程、数据库、服务器、建站、系统层层递进,构建清晰学习路径,帮助用户系统化掌握开发与运维所需的核心技术。
深度技术解析
拒绝泛泛而谈,深入技术细节与实践难点。无论是数据库优化还是服务器配置,均结合真实场景与代码示例进行剖析,致力于提供可直接应用于工作的解决方案。
专业领域覆盖
精准对应开发生命周期。从前端界面到后端编程,从数据库操作到服务器运维,形成完整闭环,一站式满足全栈工程师和运维人员的技术需求。
即学即用高效
内容强调实操性,步骤清晰、代码完整。用户可根据教程直接复现和应用于自身项目,显著缩短从学习到实践的距离,快速解决开发中的具体问题。
持续更新保障
专注既定技术方向进行长期、稳定的内容输出。确保各栏目技术文章持续更新迭代,紧跟主流技术发展趋势,为用户提供经久不衰的学习价值。