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();
相关推荐
yaoxin5211233 分钟前
406. Java 文件操作基础 - 字符与二进制流
java·开发语言·python
江屿风10 分钟前
C++OJ题经验总结(竞赛)1
开发语言·c++·笔记·算法
happymaker062611 分钟前
SpringBoot学习日记——DAY02(SpringBoot整合Swagger3)
java·spring boot·学习
阿坤带你走近大数据22 分钟前
Java中的JVM、类加载记住、多线程、性能优化的概念
java·jvm·性能优化
一勺菠萝丶26 分钟前
macOS 安装 Python 包报错:`externally-managed-environment` 怎么解决?
python
鱼鳞_33 分钟前
苍穹外卖-Day04
java
未若君雅裁36 分钟前
Spring Boot 自动配置原理与常用注解
java·spring boot·后端
醒李1 小时前
盲人出行辅助系统原型
人工智能·python·目标检测
有点。1 小时前
C++(枚举法一练习题)
开发语言·c++·算法