Java并发编程中用队列,核心是为了安全、有序、可控地传递任务或数据,阻塞队列通过自动阻塞/唤醒机制简化生产者-消费者模型,解耦线程、避免竞态,天然适配线程池与异步任务。
Java并发编程中用队列,核心是为了**安全、有序、可控地传递任务或数据**,尤其在多线程环境下避免竞态、简化同步逻辑。而阻塞队列(BlockingQueue)是其中最关键的实现——它不只是“能存取”,更在“取不到时等”、“放不下时停”上做了线程安全的封装,让生产者-消费者模型变得简洁可靠。
多个线程不直接调用彼此方法,而是通过队列交换数据。比如日志收集线程(生产者)把日志对象放进队列,日志写入线程(消费者)从队列取出并落盘。两者无需知道对方存在,也不用关心执行时机和速度差异。
普通队列(如ArrayList)在多线程下需要手动加锁+wait/notify,极易出错。阻塞队列把“判空等待”“判满等待”“唤醒通知”全封装好了:
不同场景选不同阻塞队列,灵活适配需求:
ThreadPoolExecutor内部就依赖BlockingQueue缓存待执行的Runnable任务。当线程数达到核心值且工作队列未满,新任务进队列;队列满了才可能触发拒绝策略。没有阻塞队列,线程池就无法缓冲压力,容易瞬间崩溃或丢失任务。