多线程基础:线程创建、启动与生命周期管理

多线程是现代编程中提高程序性能的重要手段。本文将介绍多线程的基础知识,包括线程的创建与启动方式,以及线程生命周期的管理,并通过Java代码示例进行说明。

线程的创建与启动方式

在Java中,创建线程主要有两种方式:

1. 继承Thread类

java 复制代码
class MyThread extends Thread {
    @Override
    public void run() {
        System.out.println("线程运行中: " + this.getName());
    }
}

public class ThreadDemo {
    public static void main(String[] args) {
        MyThread thread = new MyThread();
        thread.start(); // 启动线程
    }
}

2. 实现Runnable接口

java 复制代码
class MyRunnable implements Runnable {
    @Override
    public void run() {
        System.out.println("线程运行中: " + Thread.currentThread().getName());
    }
}

public class RunnableDemo {
    public static void main(String[] args) {
        Thread thread = new Thread(new MyRunnable());
        thread.start(); // 启动线程
    }
}

其中比较推荐使用实现Runnable接口的方式,因为Java不支持多重继承,实现接口的方式更加灵活。

线程生命周期管理

Java线程有以下几种状态:

  1. NEW(新建):线程被创建但尚未启动
  2. RUNNABLE(可运行):线程正在JVM中执行或等待操作系统资源
  3. BLOCKED(阻塞):线程等待监视器锁
  4. WAITING(等待):线程无限期等待其他线程执行特定操作
  5. TIMED_WAITING(计时等待):线程在指定时间内等待
  6. TERMINATED(终止):线程已完成执行

线程状态转换示例

java 复制代码
public class ThreadLifecycleDemo {
    public static void main(String[] args) throws InterruptedException {
        // NEW状态
        Thread thread = new Thread(() -> {
            try {
                // TIMED_WAITING状态
                Thread.sleep(1000);
                synchronized (ThreadLifecycleDemo.class) {
                    // 获取锁后执行
                    System.out.println("线程获取到锁");
                }
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        });
        
        System.out.println("创建后状态: " + thread.getState()); // NEW
        
        thread.start();
        System.out.println("启动后状态: " + thread.getState()); // RUNNABLE
        
        // 主线程休眠500ms,确保子线程进入TIMED_WAITING
        Thread.sleep(500);
        System.out.println("休眠中状态: " + thread.getState()); // TIMED_WAITING
        
        // 主线程获取锁,使子线程进入BLOCKED
        synchronized (ThreadLifecycleDemo.class) {
            Thread.sleep(1500);
            System.out.println("等待锁时状态: " + thread.getState()); // BLOCKED
        }
        
        // 等待线程结束
        thread.join();
        System.out.println("结束后状态: " + thread.getState()); // TERMINATED
    }
}

线程基本操作

1. 线程休眠

java 复制代码
try {
    Thread.sleep(1000); // 休眠1秒
} catch (InterruptedException e) {
    e.printStackTrace();
}

2. 线程加入(等待线程完成)

java 复制代码
Thread thread = new Thread(() -> {
    System.out.println("子线程执行");
});
thread.start();
thread.join(); // 主线程等待子线程执行完毕
System.out.println("主线程继续执行");

3. 线程中断

java 复制代码
Thread thread = new Thread(() -> {
    while (!Thread.currentThread().isInterrupted()) {
        System.out.println("线程运行中");
        try {
            Thread.sleep(1000);
        } catch (InterruptedException e) {
            // 捕获中断异常后中断状态会被清除
            System.out.println("线程被中断");
            Thread.currentThread().interrupt(); // 重新设置中断状态
        }
    }
});

thread.start();
Thread.sleep(3000);
thread.interrupt(); // 中断线程

总结

多线程编程是提高程序性能的有效手段,但也带来了复杂性。理解线程的创建方式、生命周期和基本操作是掌握多线程编程的基础。在实际开发中,还需要注意线程安全问题,合理使用同步机制。后续可以进一步学习线程池、并发工具类等高级主题。

相关推荐
程序猿追6 小时前
kotlin-retry 接入鸿蒙后,怎样确认它真的会停止重试
开发语言·kotlin·harmonyos
我是人✓6 小时前
Java文件上传三方式对比:从传统到SpringBoot
java·开发语言
智能直播6 小时前
网络RTMP拉流不卡顿、声音不同步,一文讲透缓冲区、时间戳
开发语言·ffmpeg·php·音视频·视频编解码
欣栀♡6 小时前
JVM 频繁 Full GC 先看日志括号里的 cause,jstat 的 FGC 在 JDK 8 上会骗人
java·jvm
CCblandy7 小时前
令牌桶在 0.9 倍负载超发 19%、固定窗口边界放行 20 个:四种限流算法同构实测
后端·python·算法·性能优化·架构
IT研究室7 小时前
最新计算机毕业设计选题推荐-基于spring boot的葡萄酒文化宣传网站-网站-文档指导-Java-springboot
java·spring boot·课程设计
慧都小项7 小时前
MyEclipse 中创建和测试 JAX-RS REST 接口:从项目配置到 REST Explorer
java·restful·myeclipse·jax-rs
Wang's Blog7 小时前
Java 项目实战: 交友项目 - 入门案例:编写 Dubbo 服务提供者
java·dubbo·交友
墨云安全7 小时前
内网资产无法暴露到公网,怎么做安全检测?2026 年内网渗透测试的落地路径
开发语言·安全·网络安全·渗透测试·php
秋饼7 小时前
Spring AI 2.0 结构化输出企业级实战:从 BeanOutputConverter 源码到生产级解析容错
java·ai·技术分享·后端开发