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

相关推荐
wxwx_bscxy32220 分钟前
基于Python新冠疫情可视化分析系统的设计与实现
java·数据库·spring boot·python·微信小程序·sqlite
evans在进步1 小时前
Tomcat NIO 工作原理详解:从 Acceptor、Poller 到容器处理链
java·tomcat·nio
渡我白衣3 小时前
并查集:基础认识与模拟实现
android·java·javascript·数据结构·c++·算法·并查集
天下无敌笨笨熊3 小时前
C#Modbus串口开发心得
开发语言·c#
电商API_180079052473 小时前
电商商品价格监控工具淘宝京东商品价格抓取API项目实操分享
java·大数据·开发语言·前端·数据挖掘
zzzll11113 小时前
深度剖析:HashMap 并发死循环与 ConcurrentHashMap 两代演进全解
java·开发语言
如意猴3 小时前
【C++】001--C++入门(1)
开发语言·c++
秋名RG3 小时前
2026/5/27 生产事故复盘与整改方案
java
传奇开心果编程3 小时前
【Rust入门知识点学与练】第10课:Option 和 Result(错误处理入门)
开发语言·学习·rust
leonkay4 小时前
C# 锁机制——【2】深入原理
开发语言·后端·spring·c#·个人开发