流水线线程1.0版本
下面先给出基础代码我会讲解一下各部分代码的作用以及他们之间的联系然后提出下面的代码的问题并提出几个解决方案1.Task任务类publicclassTask{intnum;// num20 num *10;num*num;//4000//任务ApublicvoidtaskA(){num20;}//任务BpublicvoidtaskB(){num*10;}//任务CpublicvoidtaskC(){num*num;}}2.主类importjava.util.ArrayList;publicclassMain{publicstaticvoidmain(String[]args){//定量任务ArrayListTasktasksnewArrayList();for(inti0;i500;i){tasks.add(newTask());}ThreadAtanewThreadA(tasks);ThreadBtbnewThreadB(tasks);ThreadCtcnewThreadC(tasks);ta.start();tb.start();tc.start();try{ta.join();tb.join();tc.join();}catch(InterruptedExceptione){thrownewRuntimeException(e);}for(inti0;itasks.size();i){System.out.print(tasks.get(i).num);}}}3.线程类importjava.util.ArrayList;publicclassThreadAextendsThread{ArrayListTasktasks;publicThreadA(ArrayListTasktasks){this.taskstasks;}publicvoidrun(){for(inti0;itasks.size();i){Tasktasktasks.get(i);task.taskA();}}}classThreadBextendsThread{ArrayListTasktasks;publicThreadB(ArrayListTasktasks){this.taskstasks;}publicvoidrun(){for(inti0;itasks.size();i){Tasktasktasks.get(i);task.taskB();}}}classThreadCextendsThread{ArrayListTasktasks;publicThreadC(ArrayListTasktasks){this.taskstasks;}publicvoidrun(){for(inti0;itasks.size();i){Tasktasktasks.get(i);task.taskC();}}}1.Task类作用他就是一个任务类里面有三个任务TaskA():将num增加20。TaskB():将num乘以10。TaskC():将num乘以自身。这个类会做为main类中动态数组Task的元素数组Task中的每一个元素都是一个Task类单元。实现这个功能的代码如下ArrayListTasktasksnewArrayList();for(inti0;i500;i){tasks.add(newTask());}那这个Task类和线程类有何联系首先main类中创建好动态数组并且把所有task类存入数组后每个线程类也同时会创建一个动态数组当main类中创建线程类的对象时即调用线程类的构造方法会把main中的动态数组传入线程类这时线程类中创建的动态数组就来接收main中传入的动态数组。ArrayListTasktasks;publicThreadA(ArrayListTasktasks){this.taskstasks;}2.线程类线程类的任务很简单明确线程A,B,C都会遍历动态数组储存的每个Task对象然后分别调用任务A,B,Cmain类main类的作用就是启动三个线程并且输出所有task对象的num最终值。问题这里存在并发编程问题三个线程并发地对同一个Task对象集合中地num值修改会使得有些方法调用失效。改进方法一自旋publicclassTask{intnum;booleanfA;booleanfB;booleanfC;// num20 num *10;num*num;//4000//任务ApublicvoidtaskA(){if(!fA){num20;fAtrue;}}//任务BpublicvoidtaskB(){if(!fBfA){num*10;fBtrue;}}//任务CpublicvoidtaskC(){if(!fCfB){num*num;fCtrue;}}}importjava.util.ArrayList;publicclassThreadAextendsThread{ArrayListTasktasks;publicThreadA(ArrayListTasktasks){this.taskstasks;}publicvoidrun(){while(true){System.out.println(TA Run.....);intcount0;for(inti0;itasks.size();i){Tasktasktasks.get(i);task.taskA();if(task.fA){count;}}if(counttasks.size()){break;}}}}classThreadBextendsThread{ArrayListTasktasks;publicThreadB(ArrayListTasktasks){this.taskstasks;}publicvoidrun(){for(inti0;itasks.size();i){Tasktasktasks.get(i);task.taskB();}}}classThreadCextendsThread{ArrayListTasktasks;publicThreadC(ArrayListTasktasks){this.taskstasks;}publicvoidrun(){for(inti0;itasks.size();i){Tasktasktasks.get(i);task.taskC();}}}Task 类增加了三个布尔变量用于标记每个任务是否已完成 A、B、C 操作。taskA() 只有在 fA 为 false 时才执行执行后置 fA true。taskB() 要求 fB 为 false 且 fA 为 true 才执行即 A 已完成执行后置 fB true。taskC() 要求 fC 为 false 且 fB 为 true 才执行即 B 已完成执行后置 fC true。ThreadA 采用 while(true) 循环不断遍历所有任务并调用 taskA()直到所有任务的 fA 都为 true 才退出。这保证了所有任务的 A 操作最终都会执行。ThreadB 和 ThreadC 只是简单遍历一次所有任务调用对应的 taskB() 和 taskC()没有循环。解決方案二阻塞式publicclassTask{intnum;booleanfA;booleanfB;booleanfC;// num20 num *10;num*num;//4000//任务ApublicvoidtaskA(){if(!fA){num20;fAtrue;}}//任务BpublicvoidtaskB(){while(!fA){//阻塞操作}if(!fB){num*10;fBtrue;}}//任务CpublicvoidtaskC(){while(!fB){//阻塞操作}if(!fC){num*num;fCtrue;}}}importjava.util.ArrayList;publicclassThreadAextendsThread{ArrayListTasktasks;publicThreadA(ArrayListTasktasks){this.taskstasks;}publicvoidrun(){// while (true) {// System.out.println(TA Run.....);// int count 0;for(inti0;itasks.size();i){Tasktasktasks.get(i);task.taskA();// if(task.fA){// count;// }}// if(counttasks.size()) {// break;// }}}classThreadBextendsThread{ArrayListTasktasks;publicThreadB(ArrayListTasktasks){this.taskstasks;}publicvoidrun(){// while (true) {// System.out.println(TB Run.....);// int count 0;for(inti0;itasks.size();i){Tasktasktasks.get(i);task.taskB();// if(task.fB){// count;// }}// if(counttasks.size()) {// break;// }}}classThreadCextendsThread{ArrayListTasktasks;publicThreadC(ArrayListTasktasks){this.taskstasks;}publicvoidrun(){// while (true) {// System.out.println(TB Run.....);// int count 0;for(inti0;itasks.size();i){Tasktasktasks.get(i);task.taskC();// if(task.fC){// count;// }}// if(counttasks.size()) {// break;// }}}在 Task 类中taskB() 和 taskC() 分别加入了 while(!fA) {} 和 while(!fB) {} 循环。这意味着当线程 B 调用 taskB() 时会一直空转直到某个任务的 fA 变为 true表示该任务的 A 操作已完成才继续执行 num * 10。当线程 C 调用 taskC() 时会一直空转直到某个任务的 fB 变为 true表示该任务的 B 操作已完成才继续执行 num * num。线程 A、B、C 各自只遍历一次 tasks 列表依次对每个任务调用对应的方法。线程 A 不包含任何等待逻辑。

相关新闻

PDF-Parser-1.0效果展示:实测解析含表格公式的学术论文,结果惊艳

PDF-Parser-1.0效果展示:实测解析含表格公式的学术论文,结果惊艳

PDF-Parser-1.0效果展示:实测解析含表格公式的学术论文,结果惊艳 1. 从“乱码噩梦”到“结构化宝藏”的转变 如果你经常处理学术论文、技术报告或者财务文档,一定经历过这样的痛苦: 好不容易找到一篇重要的PDF论文,…

2026/7/3 23:00:36 阅读更多 →
Text2Image-GUI:从零基础到高效部署的AI图像生成工具指南

Text2Image-GUI:从零基础到高效部署的AI图像生成工具指南

Text2Image-GUI:从零基础到高效部署的AI图像生成工具指南 【免费下载链接】text2image-gui Somewhat modular text2image GUI, initially just for Stable Diffusion 项目地址: https://gitcode.com/gh_mirrors/te/text2image-gui 价值定位:为什么…

2026/7/3 22:40:19 阅读更多 →
云容笔谈·东方红颜影像生成系统效果对比:不同参数下的国风人像生成差异

云容笔谈·东方红颜影像生成系统效果对比:不同参数下的国风人像生成差异

云容笔谈东方红颜影像生成系统效果对比:不同参数下的国风人像生成差异 最近在折腾一个挺有意思的国风人像生成系统,叫“云容笔谈东方红颜”。名字听着就很有意境,对吧?它专门用来生成那种带有东方古典韵味的人物图像。我拿到手之…

2026/5/17 10:44:39 阅读更多 →

最新新闻

三步实现Windows系统高效管理与性能优化的智能方案

三步实现Windows系统高效管理与性能优化的智能方案

三步实现Windows系统高效管理与性能优化的智能方案 【免费下载链接】winutil Chris Titus Techs Windows Utility - Install Programs, Tweaks, Fixes, and Updates 项目地址: https://gitcode.com/GitHub_Trending/wi/winutil 你是否曾经面对新电脑安装软件时的繁琐重复…

2026/7/4 9:13:31 阅读更多 →
终极音乐歌词批量下载器:163MusicLyrics完整使用指南

终极音乐歌词批量下载器:163MusicLyrics完整使用指南

终极音乐歌词批量下载器:163MusicLyrics完整使用指南 【免费下载链接】163MusicLyrics 云音乐歌词获取处理工具【网易云、QQ音乐】 项目地址: https://gitcode.com/GitHub_Trending/16/163MusicLyrics 还在为音乐播放器缺少歌词而烦恼吗?是否曾经…

2026/7/4 9:11:30 阅读更多 →
Android Framework AudioFlinge 面试题及参考答案

Android Framework AudioFlinge 面试题及参考答案

目录 请解释什么是 AudioFlinger? AudioFlinger 在 Android 系统中的位置是什么? AudioFlinger 的主要职责有哪些? AudioFlinger 如何管理音频流? 在 AudioFlinger 中,什么是音频会话? 请简述 AudioFlinger 的工作流程。 AudioFlinger 是如何与硬件交互的? 在 A…

2026/7/4 9:09:30 阅读更多 →
DocStrap安全最佳实践:防止XSS攻击和代码注入的完整指南 [特殊字符]️

DocStrap安全最佳实践:防止XSS攻击和代码注入的完整指南 [特殊字符]️

DocStrap安全最佳实践:防止XSS攻击和代码注入的完整指南 🛡️ 【免费下载链接】docstrap A template for JSDoc3 based on Bootstrap and themed by Bootswatch 项目地址: https://gitcode.com/gh_mirrors/do/docstrap DocStrap是一个基于Bootstr…

2026/7/4 9:07:30 阅读更多 →
构建高性能文档解析系统:MinerU架构设计与企业级部署指南

构建高性能文档解析系统:MinerU架构设计与企业级部署指南

构建高性能文档解析系统:MinerU架构设计与企业级部署指南 【免费下载链接】MinerU A high-quality tool for convert PDF to Markdown and JSON.一站式开源高质量数据提取工具,将PDF转换成Markdown和JSON格式。 项目地址: https://gitcode.com/OpenDat…

2026/7/4 9:07:30 阅读更多 →
AgnosticUI组件库扩展指南:创建自定义组件并集成到CLI工作流

AgnosticUI组件库扩展指南:创建自定义组件并集成到CLI工作流

AgnosticUI组件库扩展指南:创建自定义组件并集成到CLI工作流 【免费下载链接】agnosticui AgnosticUI Local (v2) is a CLI-based UI component library that copies components directly into your project. Works with AI tools, agent-driven UIs, and prompt-re…

2026/7/4 9:05:30 阅读更多 →

日新闻

Memcached 1.6.43 发布:关键安全修复版本,多项问题得到解决

Memcached 1.6.43 发布:关键安全修复版本,多项问题得到解决

Memcached 1.6.43 正式发布,这是一个关键的安全修复版本,修复了多个方面的问题,还对部分功能进行了优化。 安全修复亮点 此次发布在安全修复上表现突出。binprot 避免了项目引用计数溢出,mcmc 因安全问题提升了上游版本号&#xf…

2026/7/4 0:04:29 阅读更多 →
终极指南:使用HMCL启动器跨平台畅玩Minecraft的完整解决方案

终极指南:使用HMCL启动器跨平台畅玩Minecraft的完整解决方案

终极指南:使用HMCL启动器跨平台畅玩Minecraft的完整解决方案 【免费下载链接】HMCL A Minecraft Launcher which is multi-functional, cross-platform and popular 项目地址: https://gitcode.com/gh_mirrors/hm/HMCL HMCL(Hello Minecraft! Lau…

2026/7/4 0:06:29 阅读更多 →
KMX63与PIC18F66K40在嵌入式HMI中的硬件协同与低功耗设计

KMX63与PIC18F66K40在嵌入式HMI中的硬件协同与低功耗设计

1. KMX63与PIC18F66K40的硬件协同架构解析KMX63作为一款三轴加速度计和磁力计组合传感器,与PIC18F66K40微控制器的搭配堪称嵌入式HMI开发的黄金组合。这套硬件组合的核心优势在于KMX63提供的高精度运动感知能力与PIC18F66K40强大的信号处理能力形成了完美互补。KMX6…

2026/7/4 0:06:29 阅读更多 →

周新闻

月新闻