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();
相关推荐
秋名山小白2 小时前
Playwright UI 自动化测试实战教程
python·ui
金銀銅鐵3 小时前
一个 Java 文件实现《孫子兵法·始計篇》中英对照阅读器
java·后端·ai编程
DevOpenClub3 小时前
高考教育信息问答 API:会话参数、资料引用与流式响应
java·数据库·高考
qq_406981033 小时前
c++拷贝构造函数
开发语言·c++
bro_Java6663 小时前
《排序的底层逻辑:比较、交换与分治》
java·算法·排序算法
AI源码3 小时前
基于 Python 的汽车市场数据分析与可视化平台
python·数据分析·汽车
会飞锦鲤3 小时前
基于 SVM + HOG 的铸造缺陷检测系统
python·opencv·机器学习·计算机视觉·缺陷检测·图像分类·svm
爱喝雪碧的可乐3 小时前
MATLAB
开发语言·算法·matlab
starrysky8104 小时前
zipfile 中文乱码修复:把已知 GBK 旧 ZIP 解压到正确中文目录
python
用户91294046848425 小时前
Codex 从零到能交付(09):让 Codex 写有用的测试,而不是只测成功路径
python