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

发布于:2025-04-10 ⋅ 阅读:(42) ⋅ 点赞:(0)

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 接口更灵活,有利于任务重用和资源共享。
  • 实践应用: 在实际开发中,根据具体需求选择合适的线程创建方式。同时注意线程安全、同步等问题,确保多线程程序运行可靠。

网站公告

今日签到

点亮在社区的每一天
去签到