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

Thread与Runnable的基本区别

Thread是Java中表示线程的类,直接继承Thread类并重写run方法即可创建线程。Runnable是一个接口,需要实现run方法,并通过Thread类的构造函数传入Runnable实例来创建线程。

继承Thread类的方式简单直接,但Java不支持多重继承,限制了扩展性。实现Runnable接口更灵活,允许类继承其他类,同时实现多线程功能。

线程创建与启动

继承Thread类的方式:

java 复制代码
class MyThread extends Thread {
    public void run() {
        System.out.println("Thread running");
    }
}
MyThread t = new MyThread();
t.start();

实现Runnable接口的方式:

java 复制代码
class MyRunnable implements Runnable {
    public void run() {
        System.out.println("Runnable running");
    }
}
Thread t = new Thread(new MyRunnable());
t.start();

并发控制机制

synchronized关键字用于实现线程同步,可以修饰方法或代码块。修饰实例方法时,锁是当前实例对象;修饰静态方法时,锁是当前类的Class对象。

实例方法同步:

java 复制代码
public synchronized void increment() {
    count++;
}

代码块同步:

java 复制代码
public void increment() {
    synchronized(this) {
        count++;
    }
}

线程安全的数据结构

Java并发包提供了多种线程安全的集合类,如ConcurrentHashMap、CopyOnWriteArrayList等。这些类通过不同的并发策略实现了高性能的线程安全。

使用ConcurrentHashMap示例:

java 复制代码
ConcurrentHashMap<String, Integer> map = new ConcurrentHashMap<>();
map.put("key", 1);

线程间通信

wait()、notify()和notifyAll()方法用于线程间通信,必须在同步代码块或方法中使用。wait()使当前线程等待,释放锁;notify()唤醒一个等待线程。

生产者消费者示例:

java 复制代码
public synchronized void produce() throws InterruptedException {
    while (queue.size() == MAX) {
        wait();
    }
    queue.add(item);
    notifyAll();
}

public synchronized void consume() throws InterruptedException {
    while (queue.isEmpty()) {
        wait();
    }
    queue.remove();
    notifyAll();
}

线程池的使用

Executor框架提供了线程池管理功能,可以重用线程,减少创建和销毁线程的开销。常见的线程池类型包括FixedThreadPool、CachedThreadPool等。

创建固定大小线程池:

gitee.com/sadsadasdwe2/wvgreuxr/blob/master/sheng.md

gitee.com/sadsadasdwe2/wvgreuxr/blob/master/sheng878.md

gitee.com/sadsadasdwe2/wvgreuxr/blob/master/kol44.md

gitee.com/sadsadasdwe2/wvgreuxr/blob/master/niux.md

gitee.com/sadsadasdwe2/wvgreuxr/blob/master/dijiu.md

gitee.com/sadsadasdwe2/wvgreuxr/blob/master/liu.md

gitee.com/sadsadasdwe2/wvgreuxr/blob/master/iuijd.md

gitee.com/sadsadasdwe2/wvgreuxr/blob/master/chang.md

gitee.com/sadsadasdwe2/wvgreuxr/blob/master/jiu.md

gitee.com/sadsadasdwe2/wvgreuxr/blob/master/cood.md

gitee.com/sadsadasdwe2/wvgreuxr/blob/master/les.md

gitee.com/sadsadasdwe2/wvgreuxr/blob/master/gouh.md

gitee.com/sadsadasdwe2/wvgreuxr/blob/master/daijiji.md

gitee.com/sadsadasdwe2/wvgreuxr/blob/master/wuan.md

gitee.com/sadsadasdwe2/wvgreuxr/blob/master/fou.md

gitee.com/sadsadasdwe2/wvgreuxr/blob/master/gudeng.md

gitee.com/sadsadasdwe2/wvgreuxr/blob/master/ali.md

gitee.com/sadsadasdwe2/wvgreuxr/blob/master/jiuang.md

gitee.com/sadsadasdwe2/wvgreuxr/blob/master/wanwan.md

gitee.com/sadsadasdwe2/wvgreuxr/blob/master/chuang.md

java 复制代码
ExecutorService executor = Executors.newFixedThreadPool(4);
executor.submit(() -> {
    System.out.println("Task running");
});
executor.shutdown();

原子操作类

java.util.concurrent.atomic包提供了原子操作类,如AtomicInteger、AtomicLong等。这些类通过CAS(Compare-And-Swap)操作实现无锁线程安全。

使用AtomicInteger示例:

java 复制代码
AtomicInteger counter = new AtomicInteger(0);
counter.incrementAndGet();
相关推荐
玉鸯15 分钟前
Agent Hook:在概率推理之上,为 Agent 叠加确定性控制
python·langchain·agent
weixin_446260851 小时前
HACO:面向动态部署环境的对冲式智能计算可靠多智能体调度框架
后端·python·flask
我的xiaodoujiao1 小时前
API 接口自动化测试详细图文教程学习系列32--Allure测试报告2
python·学习·测试工具·pytest
人邮异步社区1 小时前
怎么把C语言学到精通?
c语言·开发语言
qetfw1 小时前
MXU:Tauri 2 + React 的 MaaFramework 跨平台 GUI 源码
前端·python·react.js·前端框架·开源项目·效率工具
心平气和量大福大2 小时前
C#-WPF-控件-TextBox 数据绑定
开发语言·c#·wpf
ttwuai2 小时前
Cursor 生成 CRUD 后,Go 后台接口别只测 200:JWT、RBAC 和 tenant_id 怎么验
开发语言·后端·golang
用户8356290780512 小时前
Python 实现 Excel 页面布局与打印设置自动化
后端·python
维天说2 小时前
CLI-Switch 2026年3月版历史设计:Hook、TTY 隔离与 JSON 状态
java·服务器·json