recherche

Maison  >  Questions et réponses  >  le corps du texte

java - LinkedBlockingQueue 阻塞问题

当用LinkedBlockingQueue的take()方法获取队列信息时

一旦队列为空,则进入阻塞状态

再往队列里put()元素,take()方法会自动获取新加入元素,还是始终保持阻塞状态?

伊谢尔伦伊谢尔伦2856 Il y a quelques jours1064

répondre à tous(4)je répondrai

  • PHP中文网

    PHP中文网2017-04-18 09:46:43

    Acquisition automatique, pas de blocage

    répondre
    0
  • 伊谢尔伦

    伊谢尔伦2017-04-18 09:46:43

    S'il est toujours bloqué, à quoi sert ce cours ?

    répondre
    0
  • 巴扎黑

    巴扎黑2017-04-18 09:46:43

    Il est recommandé de regarder le code source et vous le saurez, c'est très bénéfique

    répondre
    0
  • 伊谢尔伦

    伊谢尔伦2017-04-18 09:46:43

    @wxmimperio La réponse que vous avez adoptée est fausse. ConcurrentLinkedQueue n'est pas bloquant et LinkedBlockingQueue est bloquant. Je vous donne respectivement les codes : comme suit :

    import java.util.concurrent.LinkedBlockingQueue;
    public class TestLinkedBlockingQueue {
        public static void main(String[] args) {
            LinkedBlockingQueue<String> queue = new LinkedBlockingQueue<String>();
            try {
                queue.put("a");
                queue.put("b");
                System.out.println(queue.take());
                System.out.println(queue.take());
                System.out.println(queue.take());
                queue.put("c");
                System.out.println(queue.take());
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }
    //输出结果:
    //a
    //b
    

    Mais regardez la ConcurrentLinkedQueue non bloquante

    import java.util.concurrent.ConcurrentLinkedQueue;
    public class TestConcurrentLinkedQueue {
        public static void main(String[] args) {
            ConcurrentLinkedQueue<String> queue = new ConcurrentLinkedQueue<String>();
            queue.add("a");
            queue.add("b");
            System.out.println(queue.peek());
            queue.remove();
            System.out.println(queue.peek());
            queue.remove();
            System.out.println(queue.peek());
            queue.remove();
            queue.add("c");
            System.out.println(queue.peek());
            queue.remove();
        }
    }
    //a
    //b
    //null
    //Exception in thread "main" java.util.NoSuchElementException
    //    at java.util.AbstractQueue.remove(AbstractQueue.java:117)
    //    at TestConcurrentLinkedQueue.main(TestConcurrentLinkedQueue.java:14)

    répondre
    0
  • Annulerrépondre