首页 > 编程语言 >Java 并发中的设计模式

Java 并发中的设计模式

时间:2023-03-26 11:45:43浏览次数:39  
标签:Java Producer queue 并发 ArrayBlockingQueue 设计模式 Consumer public

其实在 Java 并发编程这个领域中,隐藏了许多的“设计模式”,并发编程的设计模式和我们常谈的“单例模式”、“工厂模式”这类“设计模式” ,其实可以理解为都是对代码精良设计的思想提炼。

Producer Consumer 模式

Producer-Consumer 模式是大众们使用最多的模式之一,它的主要表现形式可以用下边一张图来解释:

image.png

生产者往一个缓冲区中投递元素,接着消费者从这个缓冲区中去提取元素,这方面的具体代表如 JDK 中的 java.util.concurrent.BlockingQueue 类,这个类虽然实现了 java.util.Queue 接口,也都提供了 offerpoll 方法,但是要想利用它的阻塞效果,还是得使用它的 puttake 方法。

另外在它的底层实现方面可以选择的种类有很多种,诸如 ArrayBlockingQueue、LinkedBlockingQueue、PriorityBlockingQueue、SynchronousQueue 、DelayQueue、ConcurrentLinkedQueue。

下边我给出一段比较经典的 Producer-Consumer 模式代码,带大家理解下这种模式:

//消息生产者
public class Producer {

    private ArrayBlockingQueue<String> queue;

    public Producer(ArrayBlockingQueue<String> queue) {
        this.queue = queue;
    }

    public boolean put(String content){
        try {
            queue.put(content);
            return true;
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        return false;
    }

    public void take(){
        queue.poll();
    }
}

//消息消费者
public class Consumer {

    private ArrayBlockingQueue<String> queue;

    public Consumer(ArrayBlockingQueue<String> queue) {
        this.queue = queue;
    }

    public void start() {
        Thread t = new Thread(new Runnable() {
            public void run() {
                while (true) {
                    try {
                        String content = queue.take();
                        System.out.println("消费数据:" + content);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
            }
        });
        t.start();
    }
}

//测试代码
public class TestDemo {
    public static ArrayBlockingQueue<String> queue = new ArrayBlockingQueue<String>(20);

    public static void main(String[] args) throws InterruptedException {
        Producer producer = new Producer(queue);
        Consumer consumer = new Consumer(queue);
        consumer.start();
        while (true){
            System.out.println("投递元素");
            producer.put(UUID.randomUUID().toString());
            Thread.sleep(2000);
        }
    }

}

Producer 类内部会往一个阻塞队列中投递消息,而 Consumer 类中会有一个线程不断地从阻塞队列中取出消息,一投一取,从而形成了生产者/消费者的模式。

那么,什么场景下会使用这种模式呢?

在面对一些突发流量的时候,可以尝试利用生产者/消费者的模式来进行削减。 例如 Nacos 底层对于心跳包的处理机制就是采用了这种方式,在内存中设计了一条阻塞队列,用于接收各个注册方发送过来的心跳包数据,然后在 Nacos 的底层会有一条线程专门处理这些心跳包数据,整体流程如下图所示:

image.png

这种设计可以有效应对“当有上千节点同时往nacos中心发送心跳包”所带来的高并发请求问题。

标签:Java,Producer,queue,并发,ArrayBlockingQueue,设计模式,Consumer,public
From: https://www.cnblogs.com/fxh0707/p/17257979.html

相关文章

  • JavaScript 函数 window.matchMedia 的用途
    以下是window.matchMedia()函数的基本语法:varmediaQueryList=window.matchMedia(mediaQueryString);其中,mediaQueryString是一个字符串,表示要检查的媒体查询条件。例......
  • 关于Java:使用Mockito注入自动装配的bean并在模拟上设置一些属性
    demo/***@authorlfy*@Description支付上下文引用支付策略;这个上下文也是模板类;定义好算法步骤*@create2022-12-2822:46*/@Service@Slf4j//模板类pub......
  • java根据excel某些格子特定内容归类文件(定值单分类工具)
      packagecom.xxx.controller;importjava.io.File;importjava.io.IOException;importjava.nio.file.Files;importjava.nio.file.Path;importjava.nio.file.Pa......
  • Java学习1-前三次题目集的分析与总结
    一. 前言 作为刚学习JAVA的小白,以下只是本人作为普通学生,以当前能力和状态所做出的总结和分析,不足之处也欢迎各位大佬的指正! 第一和第二次题目集的大部分题目难度较......
  • HelloWorld之Java调用C++(JNI)
    JNI(JavaNativeInterface),通过使用Java本地接口书写程序,可以确保代码在不同的平台上方便移植。1、java新建类HelloWorld,并声明native方法,引入hello的dllpublicclassHel......
  • HelloWorld之Java调用C++(JNI)
    JNI(JavaNativeInterface),通过使用Java本地接口书写程序,可以确保代码在不同的平台上方便移植。1、java新建类HelloWorld,并声明native方法,引入hello的dllpublicclassHel......
  • Javascript实现页面商品个数增减功能
    效果利用jQuery操作页面元素的方法,实现电商网站购物车页面商品数量的增加和减少操作,要求单项价格和总价随着数量的改变而改变当用户点击+按钮是,文本框中的商品数量增加1,......
  • Caused by: java.sql.SQLException: Parameter index out of range (2 > number of pa
    一、问题背景在xml配置中自定义了sql语句二、报错截图如下三、我的项目配置如下四、分析问题五、问题原因在xml中自定义sql语句时,里面不能有注释过得sql六、解决......
  • Java ThreadLocal
    ThreadLocal的功能在Java多线程并发环境中非常实用,其作用是提供线程本地变量,例如用户ID、会话ID等与当前线程密切关联的信息。那么它在实际业务场景中可以怎么使用呢?让我们......
  • java学习日记20230325-接口
    接口基本介绍 接口就是给出一些没有实现的方法,封装到一起,到某个类要使用的时候,在根据具体情况把这些方法写出来。    如果一个类implements,需要将该接口的......