一文带你彻底掌握阻塞队列!( 五 )

可以很清晰的看到 , 延迟时间最低的排在最前面 。
四、小结最后我们来总结一下BlockingQueue阻塞队列接口,它提供了很多非常丰富的生产者和消费者模型的编程实现,同时兼顾了线程安全和执行效率的特点 。
开发者可以通过BlockingQueue阻塞队列接口,简单的代码编程即可实现多线程中数据高效安全传输的目的 , 确切的说 , 它帮助开发者减轻了不少的编程难度 。
在实际的业务开发中,其中LinkedBlockingQueue使用的是最广泛的,因为它的执行效率最高,在使用的时候,需要平衡好队列长度,防止过大导致内存溢出 。
举个最简单的例子,比如某个功能上线之后,需要做下压力测试,总共需要请求 10000 次 , 采用 100 个线程去执行,测试服务是否能正常工作 。如何实现呢?
可能有的同学想到,每个线程执行 100 次请求,启动 100 个线程去执行,可以是可以,就是有点笨拙 。
其实还有另一个办法,就是将 10000 个请求对象 , 存入到阻塞队列中,然后采用 100 个线程去消费执行,这种编程模型会更佳灵活 。
具体示例代码如下:
public static void main(String[] args) throws InterruptedException {// 将每个用户访问百度服务的请求任务,存入阻塞队列中// 也可以也采用多线程写入BlockingQueue<String> queue = new LinkedBlockingQueue<>();for (int i = 0; i < 10000; i++) {queue.put("https://www.baidu.com?paramKey=" + i);}// 模拟100个线程 , 执行10000次请求访问百度final int threadNum = 100;for (int i = 0; i < threadNum; i++) {final int threadCount = i + 1;new Thread(new Runnable() {@Overridepublic void run() {System.out.println("thread " + threadCount + " start");boolean over = false;while (!over) {String url = queue.poll();if(Objects.nonNull(url)) {// 发起请求String result =HttpUtils.getUrl(url);System.out.println("thread " + threadCount + " run result:" + result);}else {// 任务结束over = true;System.out.println("thread " + threadCount + " final");}}}}).start();}}【一文带你彻底掌握阻塞队列!】本文主要围绕BlockingQueue阻塞队列接口,从方法介绍到用法详解,做了一次知识总结 , 如果有描述不对的地方,欢迎留言指出!
五、参考1. https://www.cnblogs.com/xrq730/p/4855857.html
2. https://juejin.cn/post/6999798721269465102




推荐阅读