多线程的阻塞队列

2020-07-19  本文已影响0人  engineer_tang

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();
    }
}
上一篇 下一篇

猜你喜欢

热点阅读