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包中的高级并发工具

相关推荐
charlie11451419116 分钟前
现代C++工程实践 WeakPtr 实战(三):WeakPtrFactory 与「最后成员」惯用法
开发语言·c++·开源项目·现代c++
布吉岛的石头1 小时前
Java 程序员第 45 阶段11:网关统一路由大模型接口,配合 Nacos 配置治理,灰度路由:基于Nacos元数据实现大模型服务灰度发布与权重路由
java·服务发现
我命由我123451 小时前
Android 开发问题:Cannot resolve method ‘repeat‘ in ‘String‘
android·java·java-ee·android studio·android jetpack·android-studio·android runtime
IT小盘2 小时前
04-大模型流式输出原理-SSE与Python实现
开发语言·网络·人工智能·python
baozhengw2 小时前
信创改造-SpringBootJar包改为WAR包部署Tomcat
java·tomcat
不如语冰2 小时前
AI大模型入门-Python进阶-上下文管理与with语句
开发语言·数据结构·数据库·人工智能·pytorch·redis·python
M1A12 小时前
基于 Spring AOP 构建系统操作日志:从注解设计到异步落库的完整实战
java
RainCity2 小时前
Java Swing 自定义组件库分享(十五)
java·笔记·后端
farerboy2 小时前
23-Java 构造函数
java·后端
坚持的小马2 小时前
Rocketmq搭建操作步骤
java·rocketmq·java-rocketmq