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

多线程是现代编程中提高程序性能的重要手段。本文将介绍多线程的基础知识,包括线程的创建与启动方式,以及线程生命周期的管理,并通过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(); // 中断线程

总结

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

相关推荐
张槊哲1 小时前
字符和编码(python)
linux·数据库·python
耀耀_很无聊2 小时前
02_使用 AES 算法实现文件加密上传至阿里云、解密下载
java·spring boot·算法·阿里云·云计算·aes·oss
GalaxySpaceX2 小时前
Hibernate-Core (CVE-2020-25638)
java·spring·hibernate
景天科技苑2 小时前
【Rust通用集合类型】Rust向量Vector、String、HashMap原理解析与应用实战
开发语言·后端·rust·vector·hashmap·string·rust通用集合类型
阿沁QWQ3 小时前
友元函数和友元类
开发语言·c++
小钻风巡山4 小时前
springboot 视频分段加载在线播放
java·spring boot·后端
企鹅侠客4 小时前
写了个脚本将pdf转markdown
python·pdf·pdf转markdown
碳酸的唐4 小时前
PDF智能解析与知识挖掘:基于pdfminer.six的全栈实现
python·pdf·js
不会写代码的女程序猿4 小时前
废品回收小程序:全链路数字化解决方案,赋能绿色未来
java·小程序·微信小程序定制开发
豌豆花下猫4 小时前
Python 潮流周刊#100:有了 f-string,为什么还要 t-string?(摘要)
后端·python·ai