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,因为更加灵活,避免继承带来的局限,可以更好地与线程池等高级功能结合。

相关推荐
技术小甜甜5 分钟前
[Python] 使用 Tesseract 实现 OCR 文字识别全流程指南
开发语言·python·ocr·实用工具
leo__52010 分钟前
MATLAB 实现 基分类器为决策树的 AdaBoost
开发语言·决策树·matlab
Alsn8613 分钟前
27.IDEA 专业版创建与打包 Java 命令行程序
java·ide·intellij-idea
老朱佩琪!15 分钟前
Unity原型模式
开发语言·经验分享·unity·设计模式·原型模式
毕设源码-郭学长16 分钟前
【开题答辩全过程】以 基于JAVA的车辆违章信息管理系统设计及实现为例,包含答辩的问题和答案
java·开发语言
while(1){yan}16 分钟前
UDP和TCP的核心
java·开发语言·网络·网络协议·tcp/ip·udp
麒qiqi20 分钟前
【Linux 进程间通信】信号通信与共享内存核心解析
java·linux·算法
后端小张21 分钟前
【Java 进阶】深入理解Redis:从基础应用到进阶实践全解析
java·开发语言·数据库·spring boot·redis·spring·缓存
柯南二号21 分钟前
【后端】【Java】RabbitMQ / RocketMQ / Kafka / Redis 消息队列深度对比与选型指南
java·java-rocketmq·java-rabbitmq
木心爱编程29 分钟前
【Qt 5.14.2 新手实战】QTC++入门筑基——10 分钟做个文本编辑器:QLineEdit + QTextEdit 核心用法
java·c++·qt