[原创分享]应用多线程时的注意事项

问题描述

我现在开始公开几天前已经写好的答案。我最初考试大家的对这些问题的分析能力。可是我看到的结果看出,一些基本的多线程的RnunSynchronous方法的运行机制也根本不懂。如果,真的掌握不可能不懂返回结果应该是多少这样的具体数据。让我感叹的是这种不懂基本技术的人一大堆的人,让更多的人参与回答,可能出现更多的人犯错误。但是我这个帖子之后不再发帖讲课了,不懂礼貌的人太多了。根本不懂知识的人却反而要教人,我看了这种人太多了。这些人有个特点,比自己的技术分低锝很大差异的人,错误以为,这些人是不如自己的技术和掌握知识。我的博客地址http://blog.csdn.net/office_2007/article/details/40861655这里有答案,以后避免不该发生的错误,也不要做害人害己的代码。

解决方案

解决方案二:
没什么用...
解决方案三:
如下程序返回2,应该返回3,程序如下:intx=1+1;

然后人家问题:“你是根据什么说x应该为3呢?根据呢?”,你就大骂人家什么都不懂了,没有顺着你的话说了,“驴唇不对马嘴”了。^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^你就是上述这样以非常人的“语文素养和逻辑方式”方式去描述你的原始问题的。然后标榜自己首次在csdn上发这样的帖的目的,就是为了考试大家、来讲课。唉
解决方案四:
这里,在你连续5个述说别人“不懂”只后,你写了一句“这些人有个特点,比自己的技术分低锝很大差异的人,错误以为,这些人是不如自己的技术和掌握知识。”我告诉你,其实这是你自己的心理在作怪。分数低就“代表着技术不如自己”,这是你自己编出来的话,因为论坛上能够有这么多人、这么长时间,正常人应该可以想象到它一定是崇尚交流的,而不是什么先来后到。你先编出一个谎话,然后来扇嘴巴,这是因为你心里暗自有这个悲催的想法。
解决方案五:
LZ离能以上课/考试的形式给别人讲解多线程还差很远。大部分人是在自己掌握了乘法以后给别人讲讲加法,和别人讨论乘法问题也是谦虚的态度提供建议。你是觉得自己学会了加法就能给别人上课/考试,还幻想着别人应该“懂礼貌”,我只能说呵呵,勇气可嘉。
解决方案六:
这次只围观不接分了,上次被删了等争完了谁给个完整的讲解好了
解决方案七:
如下程序应该返回3,实则返回4inta=2;intb=a;intc=a+b;returnc;

原因是b错误的使用了a的值,改成如下inta=2;intb=1;intc=a+b;returnc;

则返回结果正常
解决方案八:
如下程序应该返回300万,实则返回400万strings="300万";

解决方案九:
粗略的看了一下,感觉不会是300W
解决方案十:
引用5楼zeratul1990的回复:

这次只围观不接分了,上次被删了等争完了谁给个完整的讲解好了

有觉悟了
解决方案十一:
引用9楼weimochengxi的回复:

Quote: 引用5楼zeratul1990的回复:
这次只围观不接分了,上次被删了等争完了谁给个完整的讲解好了

有觉悟了

反正现在积分等级改了,用不着想办法摆脱小绿三角了分多分少都无所谓了
解决方案十二:
多线程不是象你说的这么难搞吧.1.弄清该并行还是串行.2.用线程安全变量.3.线程间如何传递参数及返回.这三点基本足够了....还能生出其它的么?
解决方案十三:
引用6楼Z65443344的回复:

如下程序应该返回3,实则返回4inta=2;intb=a;intc=a+b;returnc;

原因是b错误的使用了a的值,改成如下inta=2;intb=1;intc=a+b;returnc;

则返回结果正常

你和上面几个人仍然还是执迷不悟,连自己的错误也发现不了!。可悲啊再次,看愿发帖的代码。如下程序同步运行后返回不正确,应该返回300万,实际返回了400万。ImportsSystem.Collections.ConcurrentPublicClassClass1PrivateConCurrentBag1AsNewConcurrentBag(OfInteger)'在这里创建ConcurrentBag,运行结果发生错误。SubMySub()DimTask1AsNewTask(OfConcurrentBag(OfInteger))(AddressOfMyFunc)DimTask2AsNewTask(OfConcurrentBag(OfInteger))(AddressOfMyFunc)Task1.RunSynchronously()Task2.RunSynchronously()DimList1AsNewList(OfInteger)List1.AddRange(Task1.Result)List1.AddRange(Task2.Result)MsgBox(List1.Count)EndSubFunctionMyFunc()AsConcurrentBag(OfInteger)'DimConCurrentBag1AsNewConcurrentBag(OfInteger)Forindex1AsInteger=1To1000000ConCurrentBag1.Add(index1)NextReturnConCurrentBag1EndFunctionEndClass

再次看上面代码中的RunSynchronously()方法,我请你们用自己的大脑计算两个RunSynchronously()方法之下应该返回多少的数据问题。如果,弄不清RunSynchronously()方法运行机制,不会得到正确的返回数据。我已经提前告诉应该返回300万,实际返回400万了。我在博客中已经具体说明了答案和导致错误的原因。另外,阐述了几个方法来避免错误。请看如下代码;请与上面的代码对比一下,会发现只该变了List1.AddRange(Task1.Result)接收数据顺序。结果又正确返回了300万。ImportsSystem.Collections.ConcurrentPublicClassClass1PrivateConCurrentBag1AsNewConcurrentBag(OfInteger)'在这里创建ConcurrentBag,运行结果发生错误。SubMySub()DimList1AsNewList(OfInteger)DimTask1AsNewTask(OfConcurrentBag(OfInteger))(AddressOfMyFunc)DimTask2AsNewTask(OfConcurrentBag(OfInteger))(AddressOfMyFunc)Task1.RunSynchronously()List1.AddRange(Task1.Result)Task2.RunSynchronously()List1.AddRange(Task2.Result)MsgBox(List1.Count)EndSubFunctionMyFunc()AsConcurrentBag(OfInteger)'DimConCurrentBag1AsNewConcurrentBag(OfInteger)Forindex1AsInteger=1To1000000ConCurrentBag1.Add(index1)NextReturnConCurrentBag1EndFunctionEndClass

请看如下代码;另一种方式是设法断开引用类型的引用。只改变了ConCurrentBag1.之后面加上了ToList,返回List类列表。结果正确返回了300万。[code=vb]ImportsSystem.Collections.ConcurrentPublicClassClass1DimConCurrentBag1AsNewConcurrentBag(OfInteger)SubMySub()DimTask1AsNewTask(OfList(OfInteger))(AddressOfMyFunc)DimTask2AsNewTask(OfList(OfInteger))(AddressOfMyFunc)Task1.RunSynchronously()Task2.RunSynchronously()DimList1AsNewList(OfInteger)List1.AddRange(Task1.Result)List1.AddRange(Task2.Result)MsgBox(List1.Count)EndSubFunctionMyFunc()AsList(OfInteger)'DimConCurrentBag1AsNewConcurrentBag(OfInteger)Forindex1AsInteger=1To1000000ConCurrentBag1.Add(index1)NextReturnConCurrentBag1.ToListEndFunctionEndClass[code]还有存在另一种解决方案,你们都能写出来吗?上面几个爱出风头的几个人如果有本事下面回复中写出来吧。我只认代码,我i不承认无操作性的瞎编言论。

时间: 2024-08-04 07:50:57

[原创分享]应用多线程时的注意事项的相关文章

[原创]vb.net 应用多线程时的注意事项(2)

问题描述 如下程序同步运行后返回不正确,应该返回300万,实际返回了400万.ImportsSystem.Collections.ConcurrentPublicClassClass1PrivateConCurrentBag1AsNewConcurrentBag(OfInteger)'在这里创建ConcurrentBag,运行结果发生错误.SubMySub()DimTask1AsNewTask(OfConcurrentBag(OfInteger))(AddressOfMyFunc)DimTask

浅谈使用splice函数对数组中的元素进行删除时的注意事项_javascript技巧

使用splice函数对数组中的元素进行删除时的注意事项 删除值为c的元素: <script> var arr = new Array(); arr[0] = 'a'; arr[1] = 'b'; arr[2] = 'c'; arr[3] = 'c'; arr[4] = 'e'; for(var i=0; i<arr.length; i++){ if(arr[i] == 'c'){ arr.splice(i,1); i=i-1; // 必须对i减去1,否则后面的一个元素会被跳过去 } }

网页设计经验分享;没有CSS时网页的可看性

文章简介:网页设计经验分享;没有CSS时网页的可看性. 先上示例,首页酒店模块的效果图如下: 代码结构如下: <dl>< dt>酒店</dt>< dd>北京</dd>< dd>上海</dd>< /dl>< ul>< li>北京酒店列表</li>< li>北京酒店列表</li>< li>上海酒店列表</li>< li>

C++ 关于MFC多线程编程的注意事项

  这篇文章主要介绍了C++ 关于MFC多线程编程的注意事项的相关资料,需要的朋友可以参考下 在多线程编程中,最简单的方法,无非就是利用 AfxBeginThread 来创建一个工作线程,看一下这个函数的说明: 代码如下: CWinThread* AFXAPI AfxBeginThread( AFX_THREADPROC pfnThreadProc, LPVOID pParam, int nPriority = THREAD_PRIORITY_NORMAL, UINT nStackSize =

Javascript中使用exec进行正则表达式全局匹配时的注意事项_正则表达式

本文就是介绍在使用 Javascript 中使用 exec 进行正则表达式全局匹配时的注意事项. 先看一下常见的用法: 复制代码 代码如下: <script type="text/javascript"> var pattern = /http:\/\/([^\/\s]+)/; alert(pattern.exec('http://www.codebit.cn')); // http://www.codebit.cn,www.codebit.cn alert(pattern

ThinkPHP后台首页index使用frameset时的注意事项分析_php实例

html的frameset标签在多窗口程序设计中有着广泛的应用,尤其是在项目后台页面部分.本文就来分析ThinkPHP后台首页index使用frameset时的注意事项.具体如下: 文件路径:aoli/admin/Lib/Action/IndexAction.class.php 代码如下: <?php class IndexAction extends Action{ public function index(){ $this->display(); } public function to

java 线程池 程序顺序-java多线程时程序运行完成为什么不会自动关闭退出?(木有钱了,求指教)

问题描述 java多线程时程序运行完成为什么不会自动关闭退出?(木有钱了,求指教) 粘贴的大致代码如下: public static void main(String[] args) { int thread=0; ExecutorService pool = Executors.newFixedThreadPool(15);// 创建一个线程池 for (int i =666; i <= 888; i++) { for (int j = 0; j < 19; j++) { MyClass t

微信自定义分享-tomcat下部署一手机访问的项目微信分享朋友圈时不能显示自定义的图标

问题描述 tomcat下部署一手机访问的项目微信分享朋友圈时不能显示自定义的图标 如题,html中可以写微信分享的代码,但是部署在tomcat下自定义的无效

android intent 分享音频文件时出现获取失败,怎么解决??

问题描述 android intent 分享音频文件时出现获取失败,怎么解决?? android intent 分享音频文件时出现获取失败,怎么解决?? 音频文件是sdCard上的,已经设置了权限. 代码: Intent intent = new Intent(); intent.setAction(Intent.ACTION_SEND); intent.putExtra("", Uri.fromFile(new File("sdCard", "1.mp3