Java多线程编程:Thread与Runnable的并发控制

Thread与Runnable的基本区别

Thread是Java中表示线程的类,直接继承Thread并重写run方法可以创建线程。Runnable是一个函数式接口,通过实现Runnable的run方法并将实例传递给Thread构造函数来创建线程。Runnable更灵活,适合资源共享场景。

创建线程的两种方式

继承Thread类:

java 复制代码
class MyThread extends Thread {
    @Override
    public void run() {
        System.out.println("Thread running");
    }
}
// 启动线程
new MyThread().start();

实现Runnable接口:

java 复制代码
class MyRunnable implements Runnable {
    @Override
    public void run() {
        System.out.println("Runnable running");
    }
}
// 启动线程
new Thread(new MyRunnable()).start();

共享资源与线程安全

Runnable更适合多线程共享资源场景,因为多个线程可以共享同一个Runnable实例。需要同步控制时,可使用synchronized关键字或Lock接口。

使用synchronized方法:

modelscope.cn/learn/68141

modelscope.cn/learn/68140

modelscope.cn/learn/68137

modelscope.cn/learn/68136

modelscope.cn/learn/68133

modelscope.cn/learn/68132

modelscope.cn/learn/68129

modelscope.cn/learn/68125

modelscope.cn/learn/68121

modelscope.cn/learn/68118

modelscope.cn/learn/68115

modelscope.cn/learn/68113

modelscope.cn/learn/68111

modelscope.cn/learn/68109

modelscope.cn/learn/68107

java 复制代码
class SharedResource implements Runnable {
    private int count = 0;
    
    public synchronized void increment() {
        count++;
    }

    @Override
    public void run() {
        for (int i = 0; i < 1000; i++) {
            increment();
        }
    }
}

线程状态与管理

线程生命周期包含NEW、RUNNABLE、BLOCKED、WAITING、TIMED_WAITING和TERMINATED状态。通过Thread类的方法可以管理线程:

  • start(): 启动线程
  • join(): 等待线程结束
  • interrupt(): 中断线程
  • isAlive(): 检查线程是否存活

线程池优化

推荐使用ExecutorService管理线程,避免频繁创建销毁线程的开销:

java 复制代码
ExecutorService executor = Executors.newFixedThreadPool(5);
executor.submit(new MyRunnable());
executor.shutdown();

常见并发问题解决方案

竞态条件:使用同步代码块或原子类(如AtomicInteger) 死锁:避免嵌套锁,按固定顺序获取锁 内存可见性:使用volatile关键字或同步机制

最佳实践

优先选择实现Runnable接口 避免直接使用Thread类的stop()和suspend()等已废弃方法 使用线程池而非直接创建线程 同步范围尽量缩小,减少性能影响 考虑使用java.util.concurrent包中的高级并发工具

相关推荐
IvanCodes7 分钟前
Python 正则表达式(十四):文本匹配、查找与替换
开发语言·python·正则表达式
夜雪一千7 分钟前
Python URL编码踩坑:单层编码、双重编码实战解析
开发语言·python
孙启超11 分钟前
【AI开发之Rust】第 21 课:双端集成与出包 —— Android(.so→AAR)与 iOS(xcframework)
开发语言·后端·rust
Brilliantwxx21 分钟前
【STM32】 __weak 弱引用、中断标志位、异常处理与 HAL_Delay 优先级
开发语言·stm32·单片机·嵌入式硬件
驭渊的小故事22 分钟前
SpringBoot 配置文件详解:properties 与 yml 从入门到实战
java·开发语言·笔记
Wx-bishekaifayuan24 分钟前
Springcloud中学在线学习平台58883-计算机课程设计、毕业设计
java·vue.js·spring boot·学习·spring·spring cloud·课程设计
一嘴一个橘子29 分钟前
java 中使用 lua 脚本
java
郝学胜-神的一滴37 分钟前
游戏引擎原理与实践 02:揭开3A游戏背后的技术面纱
开发语言·计算机网络·程序人生·游戏·游戏引擎
码智社38 分钟前
Spring Framework 全方位技术解析
java
m0_380743871 小时前
Qt实现调用相机进行拍照并进行图像处理
开发语言·c++