执行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
相关产品推荐
相关产品推荐

