当前位置: 首页 > news >正文

Java 多线程开发

Java 多线程开发是 Java 并发编程的核心内容,用于实现程序的并发执行,提高 CPU 利用率和系统吞吐量。以下是 Java 多线程开发的系统性介绍:


一、为什么需要多线程?

  • 提升性能:充分利用多核 CPU 资源。
  • 响应性:UI 线程不阻塞(如 Swing/JavaFX 中后台任务)。
  • 异步处理:如网络请求、文件 I/O、定时任务等。
  • 建模现实问题:如生产者-消费者、银行转账等并发场景。

二、创建线程的两种基本方式

1. 实现Runnable接口(推荐)

Runnabletask=()->System.out.println("Hello from thread: "+Thread.currentThread().getName());Threadt=newThread(task);t.start();

2. 继承Thread类(不推荐)

classMyThreadextendsThread{publicvoidrun(){System.out.println("Running in "+getName());}}newMyThread().start();

最佳实践:优先使用Runnable+Thread或更高级的并发工具(如线程池)。


三、线程的生命周期(6 种状态)

状态说明
NEW线程刚创建,未调用start()
RUNNABLE可运行(包括正在运行或等待 CPU 时间片)
BLOCKED等待获取监视器锁(如进入synchronized块)
WAITING无限期等待(如wait(),join(),LockSupport.park()
TIMED_WAITING限时等待(如sleep(1000),wait(1000)
TERMINATED线程执行完毕或异常终止

可通过Thread.getState()查看状态。


四、线程同步机制(解决共享资源竞争)

1.synchronized关键字

  • 修饰实例方法:锁当前对象(this
  • 修饰静态方法:锁类的Class对象
  • 同步代码块synchronized(obj) { ... },可指定任意锁对象

⚠️ 静态与非静态synchronized方法不互斥(锁对象不同)。

2.volatile关键字

  • 保证变量的可见性禁止指令重排序
  • 不保证原子性(如i++仍需同步)

3.java.util.concurrent.locks.Lock

  • 更灵活的显式锁(如ReentrantLock
  • 支持尝试获取锁、超时、公平锁等
Locklock=newReentrantLock();lock.lock();try{// 临界区}finally{lock.unlock();// 必须在 finally 中释放}

五、线程间通信

1.wait()/notify()/notifyAll()

  • 必须在synchronized块中调用
  • wait()释放锁并进入等待队列
  • notify()唤醒一个等待线程

2.Condition(配合Lock使用)

Locklock=newReentrantLock();Conditioncondition=lock.newCondition();// 等待lock.lock();try{condition.await();}finally{lock.unlock();}// 唤醒condition.signal();// 或 signalAll()

六、高级并发工具(java.util.concurrent包)

1. 线程池(核心!)

避免频繁创建/销毁线程,提升性能。

ExecutorServiceexecutor=Executors.newFixedThreadPool(4);executor.submit(()->{// 任务逻辑});executor.shutdown();

常用工厂方法:

  • newFixedThreadPool(n):固定大小线程池
  • newCachedThreadPool():弹性线程池(适合短任务)
  • newSingleThreadExecutor():单线程顺序执行
  • 生产建议:使用ThreadPoolExecutor自定义参数(避免Executors的隐藏风险)

2. 并发集合

  • ConcurrentHashMap:线程安全的 HashMap
  • CopyOnWriteArrayList:读多写少场景
  • BlockingQueue:如ArrayBlockingQueue,LinkedBlockingQueue(常用于生产者-消费者)

3. 同步工具类

  • CountDownLatch:等待 N 个任务完成
  • CyclicBarrier:多个线程互相等待到达屏障点
  • Semaphore:控制同时访问资源的线程数
  • CompletableFuture:异步编程(Java 8+)

七、常见问题与最佳实践

❌ 常见陷阱

  • 死锁(多个锁顺序不一致)
  • 活锁 / 饥饿
  • 内存可见性问题(忘记volatile或同步)
  • 过度同步(性能下降)

✅ 最佳实践

  1. 优先使用并发工具类(如ConcurrentHashMap而非Collections.synchronizedMap
  2. 缩小同步范围:只同步必要代码
  3. 避免在构造函数中启动线程
  4. 使用线程池管理线程,而非手动创建
  5. 命名线程:便于调试(new Thread(runnable, "MyWorker")
  6. 处理中断:响应InterruptedException,不要忽略

八、示例:生产者-消费者模型(使用BlockingQueue

BlockingQueue<Integer>queue=newArrayBlockingQueue<>(10);// 生产者Threadproducer=newThread(()->{try{for(inti=0;i<20;i++){queue.put(i);// 阻塞直到有空间System.out.println("Produced: "+i);}}catch(InterruptedExceptione){Thread.currentThread().interrupt();}});// 消费者Threadconsumer=newThread(()->{try{while(!Thread.currentThread().isInterrupted()){Integeritem=queue.take();// 阻塞直到有元素System.out.println("Consumed: "+item);}}catch(InterruptedExceptione){Thread.currentThread().interrupt();}});producer.start();consumer.start();

总结

Java 多线程开发从基础线程创建到高级并发工具,是一个逐步演进的过程。现代 Java 开发应:

“少用原始 Thread,多用 Executor;少用 synchronized,多用并发集合和原子类;善用 CompletableFuture 实现异步非阻塞。”

掌握这些知识,你就能写出高效、安全、可维护的并发程序。

http://www.jsqmd.com/news/362555/

相关文章:

  • 永磁同步电机谐波电流调控关键技术研究
  • [UG\NX二次开发] 分享“一键清除高亮工具”的源代码
  • 西南地区变压器回收服务商Top5推荐与选择技巧 - 深度智识库
  • 从心出发,向善而行——北京东慧公益基金会成立大会在京圆满举办
  • 港口岸电装上“智慧之眼”:绝缘监测与故障定位系统,让绿色能源更安全!
  • 百度竞价开户推广代运营推广科普:深圳昊客网络用数字化帮助企业实现增长引擎 - 专业GEO营销推广
  • 运维领域的多智能体可观测平台选型全景对比
  • 官宣升级!Claude Opus 4.6 正式发布,能力全面拉满,一步 API 即刻畅用
  • 当AI陷入信任危机,中国工厂已达成共识
  • 超多JavaScript实用小妙招
  • 为什么很多企业上了 ITSM,却始终停在“初级阶段”
  • 2026年四川电线电缆回收厂家权威推荐:卓航百顺实力与口碑兼具的可靠合作伙伴 - 深度智识库
  • 5个GEO产品优化误区,90%企业都踩过!3家专业服务商推荐
  • 企业加密软件都有哪些?六款值得关注的企业加密软件推荐
  • AI原生应用上下文理解:推动智能应用的创新发展
  • 2026新能源充电桩品牌推荐 本土优质企业全场景补能解决方案甄选 - 深度智识库
  • 大数据面试必问:Doris 核心原理与高频考点解析
  • 2026年百度竞价开户代运营推广公司/服务商排行榜:深圳昊客网络凭什么成为中小企业首选? - 专业GEO营销推广
  • 特定血型血液生成的研究进展:化学合成与微生物生产技术路线
  • 借助大数据分析实现电商市场洞察
  • 前端效率翻倍!Open-Lovable 克隆网页 + cpolar 穿透,告别局域网限制
  • [POI 2012] HUR-Warehouse Store题解
  • 如何成为顶尖的优秀AI系统架构师?门道在此
  • 【python3】 pip用配置文件安装模块(数理统计模块、人工智能模块)
  • Transformer能否改变胃肠道内窥镜图像分析?CNN与Transformer在性能、鲁棒性和泛化能力方面的比较分析/文献速递
  • Oracle、Mysql的数据命令导入、备份
  • Linux 命令:setfacl
  • 智慧园区:那些被技术消灭的“沉默成本”
  • P1115 最大子段和
  • Linux 命令:getfacl