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

多线程是现代编程中提高程序性能的重要手段。本文将介绍多线程的基础知识,包括线程的创建与启动方式,以及线程生命周期的管理,并通过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缕阳光3 分钟前
Java垃圾回收机制和三色标记算法
java·jvm
funnyZpC25 分钟前
好用的文档工具👉smart-doc
java
费弗里28 分钟前
Python全栈应用开发利器Dash 3.x新版本介绍(1)
python·dash
一只叫煤球的猫32 分钟前
🔥 同事混用@Transactional和TransactionTemplate被我怼了,三种事务管理到底怎么选?
java·spring boot·后端
李少兄9 天前
解决OSS存储桶未创建导致的XML错误
xml·开发语言·python
阿蒙Amon9 天前
《C#图解教程 第5版》深度推荐
开发语言·c#
就叫飞六吧9 天前
基于keepalived、vip实现高可用nginx (centos)
python·nginx·centos
Vertira9 天前
PyTorch中的permute, transpose, view, reshape和flatten函数详解(已解决)
人工智能·pytorch·python
学Linux的语莫9 天前
python基础语法
开发语言·python
匿名的魔术师9 天前
实验问题记录:PyTorch Tensor 也会出现 a = b 赋值后,修改 a 会影响 b 的情况
人工智能·pytorch·python