美文网首页
多线程的阻塞队列

多线程的阻塞队列

作者: engineer_tang | 来源:发表于2020-07-19 09:38 被阅读0次

    1. 简介

    Java5提供了一个BlockingQueue接口,主要用途是作为线程同步的工具。
    特征:当生产者线程试图向BlockingQueue中放入元素,如果该队列已满,则该线程被阻塞;当消费者线程试图从BlockingQueue中取出元素时,如果该队列已空,则该线程被阻塞。

    2. 使用案例

    Producer源码

    package com.threadtest.queue;
    
    import java.util.concurrent.BlockingQueue;
    
    public class Producer extends Thread {
    
        private BlockingQueue<String> bq;
    
        public Producer(BlockingQueue<String> bq, String name) {
            super(name);
            this.bq = bq;
        }
    
        @Override
        public void run() {
            String[] strarray = {"JAVA", "Spring", "Mybatis"};
            for(int i=0; i<1000; i++) {
                try {
                    Thread.sleep(200);
                    String str = strarray[i % 3];
                    bq.put(str);
                    System.out.println(String.format("生产者\"%s\" 生产了字符:%s", Thread.currentThread().getName(), str));
                } catch (InterruptedException e) {
    
                }
            }
        }
    }
    
    

    Consumer源码

    package com.threadtest.queue;
    
    import java.util.concurrent.BlockingQueue;
    
    public class Consumer extends Thread {
    
        private BlockingQueue<String> bq;
    
        public Consumer(BlockingQueue<String> bq, String name) {
            super(name);
            this.bq = bq;
        }
    
        @Override
        public void run() {
            while(true) {
                try {
                    Thread.sleep(2000);
                    String str = bq.take();
                    System.out.println(String.format("消费者\"%s\" 消费了字符: %s", Thread.currentThread().getName(), str));
                } catch (InterruptedException e) {
    
                }
            }
        }
    }
    
    

    队列执行类

    package com.threadtest.queue;
    
    import java.util.concurrent.ArrayBlockingQueue;
    import java.util.concurrent.BlockingQueue;
    
    public class QueueTest {
    
        public static void main(String[] args) {
            BlockingQueue<String> bQueue = new ArrayBlockingQueue(1);
            new Producer(bQueue, "生产线程1").start();
            new Producer(bQueue, "生产线程2").start();
            new Producer(bQueue, "生产线程3").start();
            new Consumer(bQueue, "消费线程").start();
        }
    }
    

    相关文章

      网友评论

          本文标题:多线程的阻塞队列

          本文链接:https://www.haomeiwen.com/subject/bjllkktx.html