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

相关推荐
ZC跨境爬虫9 分钟前
LeetCode 88. 合并两个有序数组(双指针详解 + Java Python 实现)
java·python·算法·leetcode
caimouse13 分钟前
ReactOS 图形系统分析(17):区域填充 — EngPaint / IntEngPaint(paint.c)
c语言·开发语言·算法
北风toto20 分钟前
研发效能与后端核心技术全景指南:从CI/CD到共性组件实战
java·开发语言·ci/cd
Billy1213822 分钟前
Day12-C++20 Coroutines(上):协程原理与Promise/Awaitable机制
开发语言·c++进阶学习
01二进制代码漫游日记24 分钟前
C++基础入门速通
java·开发语言·c++
Herbert_hwt25 分钟前
第六章 Java深入理解接口、函数式接口与lambda表达式
java·开发语言·算法
API快乐传递者41 分钟前
电商竞品分析接口实战指南:从数据采集到决策洞察的全链路方案
java·python
橙橙笔记44 分钟前
C++的学习第三部分
开发语言·c++·学习
程序员黑豆8 小时前
Java类型推断完全指南:从var到菱形运算符,掌握使用限制与最佳实践
java·前端·ai编程
风流 少年9 小时前
Spring AI 2.0:Memory
java·后端·spring