写在前面
本文分享Java中简单实用的并发处理方案,主要以生产者消费者模式为业务处理逻辑,含有部分实际业务代码不便分享还请谅解,在后面提供了方便大家练习的测试代码,感兴趣的小伙伴可以多设想一些场景结合测试代码进行学习。
核心思想
基于BlockingQueue的生产者、消费者模式。这是一个jdk提供的双端队列,支持读写并发,队列默认大小为Integer.MAX_VALUE,也就是只要你有内存即可。
![c1e79909f26e91d672128523a615b29c.png](https://img-blog.csdnimg.cn/img_convert/c1e79909f26e91d672128523a615b29c.png)
消息接收
消息入队,同时启动消费监听进行消费
![7964b03c0c6c1842eec9bf2065c10d05.png](https://img-blog.csdnimg.cn/img_convert/7964b03c0c6c1842eec9bf2065c10d05.png)
消息消费
从队列中获取消息进行响应的业务逻辑处理
![bce37415bf80e3a2f98f9f30023a2b13.png](https://img-blog.csdnimg.cn/img_convert/bce37415bf80e3a2f98f9f30023a2b13.png)
测试代码
import org.junit.jupiter.api.Test;import java.util.concurrent.BlockingQueue;import java.util.concurrent.LinkedBlockingQueue;public class MsgUtil { class CurMsgTasks implements Runnable { BlockingQueue blockingQueue; public CurMsgTasks(BlockingQueue blockingQueue) { this.blockingQueue = blockingQueue; } @Override public void run() { try { while (!blockingQueue.isEmpty()) { System.out.println("消费者线程 - " + Thread.currentThread().getName() + "消费消息:" + blockingQueue.take()); } } catch (InterruptedException e) { e.printStackTrace(); } } } class ProMsgTasks implements Runnable { BlockingQueue blockingQueue; public ProMsgTasks(BlockingQueue blockingQueue) { this.blockingQueue = blockingQueue; } @Override public void run() { try { for (int i = 1; i < 11; i++) { System.out.println("生产者线程 - " + Thread.currentThread().getName() + "生产消息:" + i); blockingQueue.put("任务" + i); } } catch (Exception e) { e.printStackTrace(); } } } @Test public void MsgTasks() { // 任务队列 BlockingQueue blockingQueue = new LinkedBlockingQueue<>(); // 消息生产 for (int i = 0; i < 1; i++) { ThreadUtil.getInstance().addTask(new ProMsgTasks(blockingQueue)); } // 消息消费 for (int i = 0; i < 1; i++) { ThreadUtil.getInstance().addTask(new CurMsgTasks(blockingQueue)); } }}
写在最后
代码本身很简单,涉及一些线程相关的基础知识,核心就是BlockingQueue。关于他的一些介绍和常用方法这里就不在赘述,以免浪费大家的时间,感兴趣的小伙伴可自行百度,大致看一样自己试试就明白了,主要是领会其中的原理。