当前位置: 首页 > news >正文

Java学习——day25(多线程基础与线程创建方式)

文章目录

  • 1. 多线程基础
    • 1.1 线程的概念
    • 1.2 线程的生命周期
  • 2. 创建线程的方式
    • 2.1 继承 Thread 类
    • 2.2 实现 Runnable 接口
  • 3. 实践:编写简单多线程程序
  • 4. 总结与思考

1. 多线程基础

1.1 线程的概念

  • 线程 (Thread): 程序执行的最小单元,一个进程中可以同时存在多个线程。多线程可以实现任务的并行执行,提高程序运行效率。
  • 线程与进程: 进程是程序的执行环境,而线程是进程内部的执行单元,多个线程可以共享进程内的资源(如内存、文件句柄等)。

1.2 线程的生命周期

线程从创建到终止大致有以下状态:

  • 新建(New):线程对象刚被创建,但尚未启动。
  • 就绪(Runnable):调用了 start() 1方法,等待操作系统调度分配 CPU 资源。
  • 运行(Running):线程获得 CPU 时间片,执行任务。
  • 阻塞/等待(Blocked/Waiting):线程进入等待状态(例如等待 I/O、等待其他线程通知)。
  • 终止(Terminated):线程执行完 run() 方法或因异常退出而结束执行。

2. 创建线程的方式

2.1 继承 Thread 类

  • 实现方式: 定义一个类继承 Thread,重写 run() 方法,将线程运行的业务代码写在 run() 中。
  • 特点:
    • 代码简单直观。
    • 由于 Java 只支持单继承,继承 Thread 后无法再继承其它类。
    • 适用于简单场景,或当你的类本身已经是个线程时。

2.2 实现 Runnable 接口

  • 实现方式: 定义一个类实现Runnable接口,并实现 run() 方法,将业务代码放入其中。
  • 特点:
    • 避免了单继承的限制,一个类可以同时实现多个接口。
    • 更适用于多个线程共享同一个任务,或任务需要与其他类进行逻辑组合。
    • 将任务与线程分离,提高代码的可复用性和灵活性。

3. 实践:编写简单多线程程序

下面的示例程序中创建了两个线程:

  • 一个通过继承 Thread 类的方式创建。
  • 一个通过实现 Runnable 接口的方式创建。
  • 两个线程在各自的 run() 方法中输出自己的标识信息,并循环输出简单信息。

示例代码

// MyThread.java
public class MyThread extends Thread {
    @Override
    public void run() {
        // 模拟任务:循环输出线程信息
        for (int i = 0; i < 5; i++) {
            System.out.println("【继承Thread】线程名称:" + getName() + ",计数:" + i);
            try {
                Thread.sleep(300); // 暂停300毫秒
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }
}
// MyRunnable.java
public class MyRunnable implements Runnable {
    @Override
    public void run() {
        // 模拟任务:循环输出线程信息
        for (int i = 0; i < 5; i++) {
            System.out.println("【实现Runnable】线程名称:" + Thread.currentThread().getName() + ",计数:" + i);
            try {
                Thread.sleep(300); // 暂停300毫秒
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }
}
// MultiThreadDemo.java
public class MultiThreadDemo {
    public static void main(String[] args) {
        // 方式1:继承 Thread 类
        MyThread thread1 = new MyThread();
        thread1.setName("线程-A");
        
        // 方式2:实现 Runnable 接口,传入 Thread 构造器中
        MyRunnable myRunnable = new MyRunnable();
        Thread thread2 = new Thread(myRunnable, "线程-B");
        
        // 启动两个线程
        thread1.start();
        thread2.start();
    }
}

运行步骤(以 JetBrains IntelliJ IDEA 为例)
1.新建项目:
在 IntelliJ IDEA 中创建一个新的 Java 项目,将以上三个类分别保存为 MyThread.javaMyRunnable.java、和 MultiThreadDemo.java(文件名和类名需一致)。

2.编译运行:
确保项目结构正确后,右键点击 MultiThreadDemo.java 文件,选择 Run ‘MultiThreadDemo.main()’。
IDE 的控制台窗口将显示两个线程交替输出的打印信息。

预期输出(可能输出顺序交替)

【继承Thread】线程名称:线程-A,计数:0
【实现Runnable】线程名称:线程-B,计数:0
【继承Thread】线程名称:线程-A,计数:1
【实现Runnable】线程名称:线程-B,计数:1
...
【继承Thread】线程名称:线程-A,计数:4
【实现Runnable】线程名称:线程-B,计数:4

注意:输出可能交替显示,因线程调度不可预测。

4. 总结与思考

  • **线程基本概念:掌握线程的创建、运行及生命周期状态,有助于理解并发编程模型。
  • 继承与实现:
    • 继承 Thread 的实现方式适合简单任务,但受限于单继承;
    • 实现 Runnable 接口更灵活,有利于任务重用和资源共享。
  • 实践应用: 在实际开发中,根据具体需求选择合适的线程创建方式。同时注意线程安全、同步等问题,确保多线程程序运行可靠。

相关文章:

  • idea 安装 proxyai 后的使用方法
  • DAPP实战篇:使用web3.js连接合约
  • java设计模式-模板方法模式
  • 【JavaSE】异常
  • OSPF基础入门篇②:OSPF邻居建立篇-网络设备的“社交礼仪“
  • Android里蓝牙使用流程以及问题详解
  • 深度强化学习基础 0:通用学习方法
  • 架构演进成熟度校验体系构建
  • MyBatis批量更新之CASE WHEN方式详解
  • 找搭子系统 搭子经济新风口 基于精准匹配的社交新生态探索
  • React + TipTap 富文本编辑器 实现消息列表展示,类似Slack,Deepseek等对话框功能
  • 基于二叉堆实现的 PriorityQueue
  • LLM应用实战2-理解Tokens
  • C语言malloc类函数详解
  • Linux C 与 C 语言的区别及开发差异
  • Spring MVC 请求类型注解详解
  • Java-多级排序结合thenComparing()
  • 四六级听力考试播音系统:构建播放控制智能化、发射系统双备份、发射功率有冗余、安全稳定可靠的英语四六级听力播音系统使用环境
  • vue-element-plus-admin的安装
  • pytorch小记(十六):PyTorch中的`nn.Identity()`详解:灵活模型设计的秘密武器
  • 没人愿意干的68个暴利行业/郑州网站seo顾问
  • 做本地网站应该选什么内容/上海专业seo公司
  • fw可以做网站/西安seo排名
  • 招聘网站建设人员/百度信息流是什么
  • 外贸网站怎样做推广/今日国际新闻事件
  • 大型网站建设的难点是什么/深圳百度关键词