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();
相关推荐
小羊没烦恼!12 小时前
微服务化的基石——持续集成
java·大数据·word·powerpoint·.net
默_笙12 小时前
🍙 给每个请求过安检:FastAPI 是怎么把校验写进类型注解的
python
俊昭喜喜里12 小时前
java中的继承和多态的区别
java
小羊没烦恼!12 小时前
初探性能优化——2个月到4小时的性能提升
java·开发语言·windows·算法·c#
qq_4260039612 小时前
启动playwright录制codegen生成自动化测试脚本
python·自动化
譕痕12 小时前
JSONObject与JSONArray封装数据格式区别
java·json
虎头金猫12 小时前
4K 视频总卡在公网带宽?用 N1 + OpenList 把网盘播放链路重新理顺
运维·服务器·网络·python·容器·beautifulsoup·pandas
胡写代码13 小时前
别再前后端各写一套表单校验了
java·后端
小鱼能吃糖13 小时前
缺陷修复总览 · mall电商项目:5类缺陷,1个病根,4个业务域
java·电商
长沙三为智能科技13 小时前
家政小程序开发从0到上线:五阶段交付流程与验收清单
python