Java LinkedBlockingQueue程序未终止
如果我运行以下程序,JVM将不会在执行后终止。但是,如果我从代码中取消注释行(Java LinkedBlockingQueue程序未终止,java,collections,blockingqueue,Java,Collections,Blockingqueue,如果我运行以下程序,JVM将不会在执行后终止。但是,如果我从代码中取消注释行(//newFixedThreadPool.execute(new Producer3());),程序将在执行后终止。我知道,由于队列的阻塞性质,程序不会终止。在下面代码的上下文中,代码的哪一部分阻止了JVM的终止 public class LinkedBlockingQueueExample { public static void main(String[] args) { final Blo
//newFixedThreadPool.execute(new Producer3());
),程序将在执行后终止。我知道,由于队列的阻塞性质,程序不会终止。在下面代码的上下文中,代码的哪一部分阻止了JVM的终止
public class LinkedBlockingQueueExample {
public static void main(String[] args) {
final BlockingQueue<String> blockingQueue = new LinkedBlockingQueue<String>(5);
final class Producer implements Runnable {
@Override
public void run() {
try {
blockingQueue.put("Joshua");
blockingQueue.put("Bloch");
System.out.println("Put Joshua in the queue");
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
final class Producer1 implements Runnable {
@Override
public void run() {
try {
blockingQueue.put("Martin");
blockingQueue.put("Fowler");
System.out.println("Put Mr Fowler in the Queue");
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
final class Producer3 implements Runnable {
@Override
public void run() {
try {
blockingQueue.put("Malcom");
blockingQueue.put("Gladwell");
System.out.println("Put an Outlier in the Queue");
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
final class Consumer implements Runnable {
@Override
public void run() {
try {
System.out.println(getClass() + " " + blockingQueue.take());
System.out.println(getClass() + " " + blockingQueue.take());
System.out.println(getClass() + " " + blockingQueue.take());
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
final class Consumer1 implements Runnable {
@Override
public void run() {
try {
System.out.println(getClass() + " " + blockingQueue.take());
System.out.println(getClass() + " " + blockingQueue.take());
System.out.println(getClass() + " " + blockingQueue.take());
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
ExecutorService newFixedThreadPool = Executors.newFixedThreadPool(5);
newFixedThreadPool.execute(new Producer());
newFixedThreadPool.execute(new Producer1());
// newFixedThreadPool.execute(new Producer3());
newFixedThreadPool.execute(new Consumer());
newFixedThreadPool.execute(new Consumer1());
newFixedThreadPool.shutdown();
}
}
公共类LinkedBlockingQueueExample{
公共静态void main(字符串[]args){
最终阻塞队列阻塞队列=新的LinkedBlockingQueue(5);
最终类生成器实现Runnable{
@凌驾
公开募捐{
试一试{
封锁队列。放置(“约书亚”);
blockingQueue.put(“Bloch”);
System.out.println(“让约书亚排队”);
}捕捉(中断异常e){
//TODO自动生成的捕捉块
e、 printStackTrace();
}
}
}
最后一个类Producer1实现了Runnable{
@凌驾
公开募捐{
试一试{
blockingQueue.put(“马丁”);
blockingQueue.put(“Fowler”);
System.out.println(“让福勒先生排队”);
}捕捉(中断异常e){
//TODO自动生成的捕捉块
e、 printStackTrace();
}
}
}
最后一个类Producer3实现了Runnable{
@凌驾
公开募捐{
试一试{
blockingQueue.put(“Malcom”);
阻塞队列。放置(“Gladwell”);
System.out.println(“将异常值放入队列”);
}捕捉(中断异常e){
//TODO自动生成的捕捉块
e、 printStackTrace();
}
}
}
最终类使用者实现Runnable{
@凌驾
公开募捐{
试一试{
System.out.println(getClass()+“”+blockingQueue.take());
System.out.println(getClass()+“”+blockingQueue.take());
System.out.println(getClass()+“”+blockingQueue.take());
}捕捉(中断异常e){
//TODO自动生成的捕捉块
e、 printStackTrace();
}
}
}
最后一个类Consumer1实现Runnable{
@凌驾
公开募捐{
试一试{
System.out.println(getClass()+“”+blockingQueue.take());
System.out.println(getClass()+“”+blockingQueue.take());
System.out.println(getClass()+“”+blockingQueue.take());
}捕捉(中断异常e){
//TODO自动生成的捕捉块
e、 printStackTrace();
}
}
}
ExecutorService newFixedThreadPool=Executors.newFixedThreadPool(5);
执行(newproducer());
执行(newproducer1());
//执行(newproducer3());
执行(新使用者());
执行(newconsumer1());
newFixedThreadPool.shutdown();
}
}
额外的“take”正在阻止终止。它阻塞额外的“take”take()
调用始终阻塞,直到元素可用。。
如果您不想阻止,则用户poll()
参考:
poll()
Retrieves and removes the head of this queue, or returns null if this queue is empty.