Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/389.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java LinkedBlockingQueue程序未终止_Java_Collections_Blockingqueue - Fatal编程技术网

Java LinkedBlockingQueue程序未终止

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

如果我运行以下程序,JVM将不会在执行后终止。但是,如果我从代码中取消注释行(
//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.