乐清门户网站电商网站前端页面响应式设计

张小明 2026/1/2 2:04:30
乐清门户网站,电商网站前端页面响应式设计,因网站建设关闭的公告,滕建建设集团网站一、BlockingQueue的基本用法1-1、什么是 BlockingQueue#xff1f;想象你在一个饭店排队买饭。BlockingQueue 就像这个队列一样#xff0c;但它有个特殊功能#xff1a;如果队伍满了#xff0c;后来的人会自动等待#xff1b;如果队伍空了#xff0c;取餐的人会自动等待…一、BlockingQueue的基本用法1-1、什么是 BlockingQueue想象你在一个饭店排队买饭。BlockingQueue 就像这个队列一样但它有个特殊功能如果队伍满了后来的人会自动等待如果队伍空了取餐的人会自动等待。这就是 BlockingQueue 的核心思想。1-2、为什么需要它在多线程程序中经常需要一个线程生产数据另一个线程消费数据。BlockingQueue 就是为了让这两个线程安全、方便地交互。比如线程A不断生产任务放入队列线程B从队列取任务然后处理如果队列满了线程A自动等待如果队列空了线程B自动等待这样两个线程就协调得很好。1-3、常用操作BlockingQueue 有四种主要的操作方式1. 添加元素add(E)-队列满了会报错put(E)- 队列满了会等待offer(E)- 队列满了会返回 false2. 移除元素remove()-队列空了会报错take()- 队列空了会等待poll()- 队列空了会返回 null1-4、简单例子BlockingQueueString queue new LinkedBlockingQueue(3); // 容量为3 // 线程1生产者 new Thread(() - { try { queue.put(任务1); queue.put(任务2); queue.put(任务3); System.out.println(任务都放入了); } catch (InterruptedException e) { e.printStackTrace(); } }).start(); // 线程2消费者 new Thread(() - { try { String task queue.take(); System.out.println(处理: task); } catch (InterruptedException e) { e.printStackTrace(); } }).start();1-5、实际场景生产者-消费者问题假如你有一条流水线工人A负责制造零件工人B负责组装。BlockingQueue 就像中间的储存架子A 把零件放上去B 从上面取。如果架子满了A 就等待如果架子空了B 就等待。1-6、常见类型LinkedBlockingQueue- 用链表实现性能一般ArrayBlockingQueue- 用数组实现性能好PriorityBlockingQueue- 带优先级的队列简单来说BlockingQueue 线程安全的队列 自动等待机制。它让多线程协作变得简单安全。1-7、测试代码import java.util.concurrent.BlockingQueue; import java.util.concurrent.LinkedBlockingQueue; import java.util.concurrent.CountDownLatch; public class BlockingQueueTest { public static void main(String[] args) throws InterruptedException { // 创建一个容量为10的队列 BlockingQueueString queue new LinkedBlockingQueue(10); // 用于同步等待所有线程完成 CountDownLatch latch new CountDownLatch(6); // 5个生产者 1个消费者 System.out.println( 开始测试 BlockingQueue 线程安全性 \n); // 创建5个生产者线程 for (int i 1; i 5; i) { final int producerId i; new Thread(() - { try { for (int j 1; j 20; j) { String item 生产者 producerId -任务 j; queue.put(item); System.out.println([生产] item | 队列大小: queue.size()); Thread.sleep(10); // 模拟生产耗时 } } catch (InterruptedException e) { Thread.currentThread().interrupt(); } finally { latch.countDown(); } }, Producer- i).start(); } // 创建1个消费者线程 new Thread(() - { try { for (int i 0; i 100; i) { // 消费100个任务 String item queue.take(); System.out.println([消费] item | 队列大小: queue.size()); Thread.sleep(50); // 模拟消费耗时 } } catch (InterruptedException e) { Thread.currentThread().interrupt(); } finally { latch.countDown(); } }, Consumer-1).start(); // 等待所有线程完成 latch.await(); System.out.println(\n 测试完成 ); System.out.println(最终队列大小: queue.size()); System.out.println(如果没有异常说明 BlockingQueue 是线程安全的); } }这段代码测试了什么5个生产者线程- 同时生产任务每个生产 20 个1个消费者线程- 消费所有的任务CountDownLatch- 等待所有线程完成二、解释Thread.currentThread().interrupt();以上测试代码中有Thread.currentThread().interrupt()这行代码。这是什么意思呢2-1、它是干什么的Thread.currentThread().interrupt()的作用是向当前线程发送一个中断信号。2-2、中断是什么中断不是强制杀死线程而是一种礼貌的通知机制。它告诉线程嘿有人希望你停止工作了。线程可以选择听或不听这个通知。2-3、代码中的场景在我之前的测试代码中这行代码出现在catch块里try { // ... 代码执行 } catch (InterruptedException e) { Thread.currentThread().interrupt(); // 这里 }2-4、为什么要这样做当你调用queue.take()或queue.put()时如果线程被中断了会抛出InterruptedException异常。这时有三种处理方式方式1忽略异常不推荐try { queue.take(); } catch (InterruptedException e) { // 什么都不做异常就丢失了 }问题中断信号丢失了外层代码不知道发生过中断。方式2重新中断线程推荐try { queue.take(); } catch (InterruptedException e) { Thread.currentThread().interrupt(); // 恢复中断状态 }这样做是为了保留中断信息让外层代码知道这个线程曾经被中断过。方式3直接抛出异常也可以try { queue.take(); } catch (InterruptedException e) { throw new RuntimeException(e); // 让外层处理 }2-5、一个生动的比喻想象你在专心工作老板过来轻轻拍你肩膀说我需要你停下来。这就是中断。如果你直接说好的我停这是正常响应中断如果你继续工作装作没听到这是忽略中断如果你之后主动告诉别人老板曾经中断过我这是保留中断状态2-6、实际例子public class InterruptExample { public static void main(String[] args) throws InterruptedException { Thread thread new Thread(() - { try { System.out.println(线程开始睡眠...); Thread.sleep(10000); // 睡眠10秒 } catch (InterruptedException e) { System.out.println(我被中断了); Thread.currentThread().interrupt(); // 恢复中断状态 } // 检查中断状态 if (Thread.currentThread().isInterrupted()) { System.out.println(中断状态为真线程即将退出); } }); thread.start(); Thread.sleep(1000); // 等待1秒 thread.interrupt(); // 中断线程 } }运行结果线程开始睡眠... 我被中断了 中断状态为真线程即将退出2-7、总结Thread.currentThread().interrupt() 恢复线程的中断状态它用在catch(InterruptedException)里防止中断信息丢失这是处理线程中断的最佳实践三、CountDownLatch工具3-1、它是干什么的CountDownLatch是一个倒计时器。它让一个线程等待其他多个线程完成后再继续执行。3-2、生动比喻想象你是一个班级的班长要组织全班去春游班长说我们等所有人都到达集合点后再一起出发班长创建一个倒计时器数字设为 50班级有 50 人每当一个学生到达倒计时器就减 1当倒计时器变成 0 时班长就知道所有人都到了可以出发3-3、代码中的含义CountDownLatch latch new CountDownLatch(6);这行代码的意思是创建一个倒计时器初始值为 6为什么是 6因为你有5 个生产者线程1 个消费者线程总共 6 个线程3-4、三个关键方法1.countDown()- 倒计时减 1latch.countDown(); // 倒计时从 6 变成 52.await()- 等待倒计时到 0latch.await(); // 阻塞当前线程直到倒计时变成 03.getCount()- 查看当前倒计时值System.out.println(latch.getCount()); // 打印剩余的数字3-5、代码执行流程CountDownLatch latch new CountDownLatch(6); // 倒计时: 6 // 启动6个线程... latch.await(); // main线程阻塞等待这里 // 等等等等... // 当6个线程都执行了 latch.countDown() 时 // 倒计时变成 0main线程才会继续 System.out.println(所有线程都完成了);3-6、测试代码// 创建的6个线程 for (int i 1; i 5; i) { new Thread(() - { try { // ... 生产任务 } finally { latch.countDown(); // 线程完成时倒计时减1 } }).start(); } new Thread(() - { try { // ... 消费任务 } finally { latch.countDown(); // 线程完成时倒计时减1 } }).start(); latch.await(); // main线程在这里等待直到倒计时变成0 System.out.println( 测试完成 ); // 所有线程都完成后才执行3-7、没有 CountDownLatch 会怎样// 不用 CountDownLatch for (int i 0; i 6; i) { new Thread(() - { // ... 做工作 }).start(); } System.out.println( 测试完成 ); // 这会立即执行 // 此时工作线程可能还没完成这样的话工作线程还在忙的时候main 线程就已经打印测试完成了。很不安全。3-8、实际例子import java.util.concurrent.CountDownLatch; public class CountDownLatchDemo { public static void main(String[] args) throws InterruptedException { System.out.println(班长请所有同学到集合点集合...\n); CountDownLatch latch new CountDownLatch(5); // 5个学生 // 5个学生线程 for (int i 1; i 5; i) { final int studentId i; new Thread(() - { try { // 学生去不同的地方耗时不同 long time (long)(Math.random() * 3000) 1000; System.out.println(学生 studentId 我在外面需要 time ms才能到达); Thread.sleep(time); System.out.println(学生 studentId 我到达了); latch.countDown(); // 倒计时减1 System.out.println(【还剩 latch.getCount() 个学生未到达】); } catch (InterruptedException e) { e.printStackTrace(); } }, Student- i).start(); } System.out.println(班长我在集合点等待...\n); latch.await(); // 班长在这里等待阻塞 System.out.println(\n班长太好了所有同学都到了我们出发去春游); } }运行这个代码你会看到班长请所有同学到集合点集合... 学生1我在外面需要1234ms才能到达 学生2我在外面需要2567ms才能到达 ... 班长我在集合点等待... 学生1我到达了 【还剩4个学生未到达】 学生3我到达了 【还剩3个学生未到达】 ... 班长太好了所有同学都到了我们出发去春游3-9、总结CountDownLatch 倒计时器创建时指定初始值等待的线程个数每个工作线程完成后调用countDown()主线程调用await()阻塞等待当倒计时变成 0 时主线程被唤醒这样可以保证主线程一定要等所有工作线程完成后才继续。
版权声明:本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!

网站从新建设影响收录么如何在自己的电脑上做网站

1. 参数与比特选择 在小模型设计中,首先需要在 低比特高参数 与 高比特低参数 之间进行权衡。我们提出的指导原则是: 优先选择 低比特高参数 的方案。原因在于:低比特表示能够显著降低存储与计算成本,而高参数量则保证了模型的表达…

张小明 2025/12/27 7:27:49 网站建设

仿站视频教程网站性能优化方法

在分布式系统中,RabbitMQ 作为主流的消息中间件,承担着解耦、削峰、异步通信的核心职责。但随着业务流量的激增,很多开发者都会遇到两大棘手问题:消息堆积(队列消息越积越多,消费滞后严重)和吞吐…

张小明 2025/12/28 3:19:40 网站建设

网站关键词优化工具乐清市腾速网络科技有限公司

大家好,我是老刘 最近如果你盯着 Flutter 的 release 页面会发现,从 11月12日 到 12月11日,短短 30 天内,Flutter 官方竟然一口气更新了 6 个版本! 平均 5 天一个版本,最夸张的时候,两个补丁版本…

张小明 2025/12/27 21:02:08 网站建设

自己做的网站如何放进服务器wordpress建立公司网站

利用HunyuanVideo-Foley和GitHub开源生态构建自动化视频后期流水线 在短视频日均产量突破千万条的今天,内容创作者正面临一个尴尬的现实:精心拍摄的画面配上“干瘪”的无声回放,观众三秒内就会划走。而专业音效制作动辄数小时、依赖音频工程师…

张小明 2025/12/28 3:19:33 网站建设

node 做的网站后端网络营销的未来发展趋势论文

第一章:为什么顶尖AI团队都在用Open-AutoGLM做模型瘦身? 在大模型时代,推理延迟与部署成本成为制约AI落地的关键瓶颈。越来越多的顶尖AI团队转向使用 Open-AutoGLM —— 一个专为 GLM 架构设计的自动化模型压缩框架,实现高效、无损…

张小明 2026/1/1 18:16:30 网站建设

对网站建设提建议中国知名设计网站

💡实话实说:有自己的项目库存,不需要找别人拿货再加价,所以能给到超低价格。摘要 随着高校规模的不断扩大和学生人数的持续增长,校园内的闲置物品数量逐年上升,如何高效管理和交易这些闲置物品成为校园资源…

张小明 2025/12/28 0:02:42 网站建设