You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

执行SynchronousQueue的put操作后线程挂起,Eclipse调试无响应原因咨询

问题原因分析

这事儿的核心在于你对SynchronousQueue的特性理解不到位哦!

SynchronousQueue是个非常特殊的阻塞队列——它没有任何容量。这意味着:

  • 当一个线程调用put()方法时,它必须等待另一个线程调用take()方法来接收这个元素,否则put线程会一直处于阻塞状态;
  • 反过来,调用take()的线程也必须等一个put线程来提供元素,否则同样会阻塞。

再看你的代码:
你启动了两个生产者线程,它们都在调用put()方法往队列里塞数据,但没有任何一个线程在调用take()来取出数据。第一个线程执行s.put("Suman")时,因为没人取,直接阻塞;第二个线程执行s.put("Ghosh")时,同样因为没有消费者,也陷入阻塞。

这时候你的程序里,两个工作线程都卡在阻塞状态,main线程启动完这两个线程就结束了,但JVM会因为还有存活的非守护线程(这两个生产者线程)而保持运行状态。在Eclipse调试时,因为所有可执行的线程都被挂起在阻塞点,自然就出现“程序控制权消失、无法继续调试”的情况了。

如果要验证这个问题,你可以加一个消费者线程试试:

class Consumer implements Runnable {
    SynchronousQueue<String> s=null;
    Consumer(SynchronousQueue<String> q) {
        this.s=q;
    }
    @Override
    public void run() {
        try {
            System.out.println("取出元素:" + s.take());
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
}

然后在main方法里启动一个消费者线程,你会发现put操作不再阻塞,程序能正常执行下去。

内容的提问来源于stack exchange,提问作者suman ghosh

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 04:31:26