(新思路)生产者消费者模型2(BlockingQueue的无锁解决方法)

来源:互联网 发布:有关网络暴力的论文 编辑:程序博客网 时间:2024/06/01 18:28
通过阻塞队列来模拟生产者消费者模型,和synchronized(wait和notifyAll)、lock(condition)方法相比,效率更高,因为不需要人为加锁。

LinkedBlockingQueue的实现方式(无界队列,可以装到内存满为止)

ArrayBlockingQueue的实现方式(有界队列,固定产品容器的大小)
1
public class TestArrayBlockingQueue {
2
    //初始化阻塞队列容器(放10个产品)
3
    static BlockingQueue<String> products = new ArrayBlockingQueue<String>(10);
4
    
5
    static Random r = new Random();
6
    
7
    public static void main(String[] args){
8
        //1个生产者线程
9
        new Thread(()->{
10
            for(int i=0;i<100;i++){//生产100个产品(放在容量为10的容器里)
11
                try{
12
                    products.put("产品:"+i);//容器满了则阻塞等待消费者消费
13
                }catch (InterruptedException e){
14
                    e.printStackTrace();
15
16
                }
17
            }
18
        },"生产者").start();
19
20
        //5个消费者线程
21
        for(int i=0;i<5;i++){
22
            new Thread(()->{
23
                for(;;){//死循环,一直在消耗产品,如果产品为空则产品容器队列阻塞,等待产品生产
24
                    try{
25
                        //消费者线程消费产品
26
                        System.out.println(Thread.currentThread().getName()+"消费:"+products.take());
27
                    }catch(InterruptedException e){
28
                        e.printStackTrace();
29
                    }
30
                }
31
            }).start();
32
        }
33
34
    }
35
}
阅读全文
0 0
原创粉丝点击