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

相关推荐
yaoxin5211231 小时前
434. Java 日期时间 API - Period 基于日期的时间段
java·开发语言·python
凡人叶枫2 小时前
Effective C++ 条款30:透彻了解 inlining 的里里外外
linux·开发语言·c++·嵌入式开发·effective c++
学逆向的2 小时前
C++纯虚函数
开发语言·c++·网络安全
何极光2 小时前
IDEA集成Maven
java·maven·intellij-idea
程序员二叉2 小时前
【JUC】ThreadLocal底层原理|内存泄漏|弱引用|跨线程传递方案
java·开发语言·面试·职场和发展·juc
程序员二叉2 小时前
【JUC】线程池全套深度详解|参数|流程|拒绝策略|调优|异常处理
java·开发语言·jvm·算法·面试·juc
老马识途2.03 小时前
在AI的帮助下理解spring的启动过程
java·前端·spring
青山木3 小时前
Hot 100 --- 轮转数组
java·数据结构·算法
凡人叶枫3 小时前
Effective C++ 条款22:将成员变量声明为 private
linux·开发语言·c++
Qt程序员3 小时前
掌握 Linux 内核调度:从原理到实现(进程篇)
java·开发语言