JavaEE-多线程实战02

接上

多线程编程实战01


第三个多线程程序

java 复制代码
package thread.test;

//定义了一个叫MyThread3的类,实现了Runable接口,所以它必须重写run()方法
class MyThread3 implements Runnable {
    
    @Override
    public void run() {
        //线程执行的具体内容
        //进入一个无限循环,每一秒输出一句"hello runnable"
        while (true) {
            System.out.println("hello runnable");

            try {
                //让线程睡眠1秒。避免一直疯狂输出
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                //如果睡眠被中断,抛出运行时异常RuntimeException
                throw new RuntimeException(e);
            }
        }
    }
}


//主程序入口
public class ThreadDemo3 {
    public static void main(String[] args) {
        //新建一个线程,线程要执行的人物是MyThread3实现的run()方法
        Thread t=new Thread(new MyThread3());
        //启动线程,注意:不是调用run(),这样才会新建一个线程
        t.start();

        //主线程也进入无限循环
        while (true) {
            //每一秒输出一行"hello main"
            System.out.println("hello main");

            try {
                //让线程休眠1秒
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                //如果休眠中断,抛出运行时异常
                throw new RuntimeException(e);
            }
        }
    }
}

Runnable 和 Thread 的区别

特点 Runnable 接口 Thread
本质 是一个接口 是一个 ,继承自 Object,实现了 Runnable 接口
用途 只定义了一个任务(run() 方法),不负责线程的创建 既可以定义任务(重写 run()),也能直接创建和管理线程
继承限制 可以避免单继承局限(因为类还可以继承别的类) 继承了 Thread 后,不能再继承其他类(Java 单继承)
推荐使用场景 任务和线程分离,程序更灵活、解耦 小项目、简单场景下可以直接继承 Thread 简单快速

为什么写 Thread t = new Thread(new MyThread3());

原因就是:

  • new MyThread3() 是一个实现了 Runnable 的对象,它描述了线程应该执行什么任务 (即 run() 方法里的代码)。

  • new Thread(Runnable target) 这个构造方法,把 Runnable 包装进去,真正由 Thread 来创建和控制线程

  • 最后通过 t.start() 来开启这个线程,执行 MyThread3.run() 里面的逻辑。

简单理解就是

  • Runnable 负责写任务(要干什么事)。

  • Thread 负责开辟新线程、调度执行这个任务。

打个比方(形象理解)

  • Runnable 就像是工作说明书(比如说明:搬砖、洗衣服、打扫卫生)。

  • Thread 就像是真正的工人,要按照说明书去干活。

你可以写好很多不同的说明书(不同的 Runnable),然后招很多工人(Thread)去根据说明来工作。

例子

方式一:实现 Runnable(推荐 ✅)
java 复制代码
class MyRunnable implements Runnable {
    @Override
    public void run() {
        System.out.println("任务开始了");
    }
}

public class Test {
    public static void main(String[] args) {
        Runnable r = new MyRunnable();  // 任务
        Thread t = new Thread(r);        // 线程 + 任务
        t.start();                      // 开启线程
    }
}
方式二:直接继承 Thread(简单,但不够灵活)
java 复制代码
class MyThread extends Thread {
    @Override
    public void run() {
        System.out.println("任务开始了");
    }
}

public class Test {
    public static void main(String[] args) {
        Thread t = new MyThread();   // 直接是线程
        t.start();                  // 开启线程
    }
}

总结一下

  • Runnable 只管写任务,不管线程怎么执行。

  • Thread 既是线程本身,也能直接运行任务。

  • 推荐用 Runnable,因为更加灵活,避免继承带来的局限,可以更好地与线程池等高级功能结合。

相关推荐
海盗强6 分钟前
Babel、core-js、Loader之间的关系和作用全解析
开发语言·前端·javascript
猿榜编程7 分钟前
python基础-requests结合AI实现自动化数据抓取
开发语言·python·自动化
mask哥19 分钟前
详解最新链路追踪skywalking框架介绍、架构、环境本地部署&配置、整合微服务springcloudalibaba 、日志收集、自定义链路追踪、告警等
java·spring cloud·架构·gateway·springboot·skywalking·链路追踪
XU磊26022 分钟前
javaWeb开发---前后端开发全景图解(基础梳理 + 技术体系)
java·idea
我最厉害。,。23 分钟前
PHP 反序列化&原生类 TIPS&字符串逃逸&CVE 绕过漏洞&属性类型特征
android·开发语言·php
爱编程的鱼24 分钟前
C# 类(Class)教程
开发语言·c#
学也不会25 分钟前
雪花算法
java·数据库·oracle
2301_8170316533 分钟前
C语言-- 深入理解指针(4)
c语言·开发语言·算法
晓华-warm33 分钟前
国产免费工作流引擎star 5.9k,Warm-Flow版本升级1.7.0(新增大量好用功能)
java·中间件·流程图·开源软件·flowable·工作流·activities
superior tigre34 分钟前
C++学习:六个月从基础到就业——模板编程:模板特化
开发语言·c++·学习