程序什么时候应该使用线程?

使用多线程编程可以给程序员带来很大的灵活性,同时也使原来需要复杂技巧才能解决的问题变得容易起来。不论什么时候只要能用单线程就不用多线程,只有在需要响应时间要求比较高的情况下用多线程。某操作允许并发而且该操作有可能阻塞时,用多线程。


线程很有用,但当使用线程时,可能会在解决老问题的同时产生新问题。例如要开发一个字处理程序,并想让打印功能作为单独的线程自己执行。这听起来是很好的主意,因为在打印时,用户可立即返回,开始编辑文档。但这样一来,在该文档被打印时文档中的数据就有可能被修改,打印的结果就不再是所期望的内容。也许最好不要把打印功能放在单独的线程中,不过如果一定要用多线程的话,也可以考虑用下面的方法解决:

第一种方法是锁定正在打印的文档,让用户编辑其他的文档,这样在结束打印之前,该文档不会作任何修改;

第二个方法可能更有效一些,即可以把该文档拷贝到一个临时文件中,打印这个临时文件的内容,同时允许用户对原来的文档进行修改。当包含文档的临时文件打印完成时,再删去这个临时文件。

通过上面的分析可以看出,多线程在帮助解决问题的同时也可能带来新问题。因此有必要弄清楚,什么时候需要创建多线程,什么时候不需要多线程。总的来说,多线程往往用于在前台操作的同时还需要进行后台的计算或逻辑判断的情况,而对于GUI(图形用户接口),除了开发MDI(多文档界面)应用程序外,应尽量不使用多线程。


多线程
1、就如多了几副碗筷,可以抢占更多的系统资源,加快可以分割成独立执行单元的程序段运行
2、提供良好的操作感受:不在UI主线程执行费时的作业(这些作业以线程运行)
3、响应多个并行的请求


简单的顺序执行方式不能满足要求的时候需要考虑多线程实现,或者有些多任务管理时也需要用到多线程,否则无法并行执行不同功能等等吧。

单线程好比所有工作都要你自己干,那样你只能一样一样来,多进程好比你把这些工作分给若干人,大家同步进行,同步进行的好处是大家各干各的,除了接口外,其他工作都独立完成,这样不管是逻辑还是时间上都更加合理,就好象你们单位的若干部门协调工作一样。如果所有部门的工作都要你们老总一个人干,那就是单线程了。


什么时候单线程效率高?

对于处理时间短的服务或者启动频率高的要用单线程,相反用多线程!

8.程序什么时候应该使用线程,什么时候单线程效率高?相关推荐

  1. StringBuilder和StringBuffer哪个线程安全?执行效率高?

    StringBuilder是线程不安全的,执行效率高 StringBuffer是线程安全的,加了synchronized同步关键字,执行效率高

  2. HashMap和HashTable的区别?但是如果想线程安全有想效率高?

    ConcurrentHashMap Map<String,Object> concurrentHashMap=new ConcurrentHashMap<String,Object& ...

  3. 【笔记】ConcurrentHashMap,保证线程安全,并且效率高

  4. 编写一个Java程序实现多线程,在线程中输出线程的名字,隔300毫秒输出一次,共输出20次。

    编写一个Java程序实现多线程,在线程中输出线程的名字,隔300毫秒输出一次,共输出20次. 一.ThreadDemo class ThreadDemo extends Thread {public ...

  5. Thread\Threading.Timer\Task中ShowDialog()方法报错:“在可以调用 OLE 之前,必须将当前线程设置为单线程单元(STA)模式”

    在可以调用 OLE 之前,必须将当前线程设置为单线程单元(STA)模式.请确保您的 Main 函数带有 STAThreadAttribute 标记. 出错环境: 1.在Thread线程中,调用Show ...

  6. 多线程与高并发(六):线程池可用的各种高并发容器详解:CopyOnWriteList,BlockingQueue等

    容器 物理结构:数组.链表 逻辑结构:很多 Queue主要是为高并发准备的. Vector Hashtable Vector Hashtable 自带锁,有很多设计上不完善的地方,现在基本上不用. 测 ...

  7. 异常错误:在可以调用 OLE 之前,必须将当前线程设置为单线程单元(STA)模式

    最近做一个蛋疼的东西就是C#调用windows API 来操作一个摄像头,自动处理一些东西.要用到剪切板复制 粘贴功能,即 Clipboard.SetDataObject(filedic, true) ...

  8. C#异常解决:在调用OLE之前,必须将当前线程设置为单线程单单元(STA)模式。

    问题来源: 昨晚上在调试数据库大作业的时候,我在注册界面Register里点击"上传头像"这个linklabel时,程序出现了一个异常:在调用OLE之前,必须将当前线程设置为单线程 ...

  9. 自定义线程池拒绝策略缓解高并发下线程池压力

    一. 默认的拒绝策略 ThreadPoolExceutor.AbortPolicy : 丢弃任务并抛出RejectedExecutionException异常.         ThreadPoolE ...

最新文章

  1. ai的弹窗点了都不响应_【评价集合】拼多多评价,你所不知道的点都在这里!...
  2. JSR315(JavaTM Servlet 3.0 Specification)
  3. Linux C :线程操作和线程同步的多线程并发编程
  4. 在 Linux 中查找和删除重复文件
  5. Maven异常总结001---Maven project导入到myeclipse时候出现异常:could not get mojo execution paramater value
  6. Mac Crack路欧词典(所有版本)
  7. 页面静态化3 --- 伪静态技术
  8. Intel SGX技术详细解释(非常棒)
  9. 考研二战上岸985的经验教训分享
  10. vue 的ui组件库
  11. 工作两三年了,整不明白架构图都画啥?
  12. 收藏的经典影视视频下载地址
  13. unity-shader-基于图像的光照IBL
  14. (OK) MIMP - 18 ( 5 nodes) - 抓包-缺少 MPTCP-JION - 发现了另一个问题【M1 ping M5】不可以 ping 通
  15. 解决:coursera视频加载不出来无法观看
  16. java中的静态是什么?怎么用?
  17. AIS标准(ITU-R M.1371-5)和Python解码模块
  18. 100元钱买100只鸡
  19. 简述SpringMVC及其工作流程图
  20. 深度学习炼丹-超参数设定和模型训练

热门文章

  1. Palindrome(插入字符变成回文字符串)
  2. perl正则表达式-1
  3. Windows下如何安装和使用git
  4. linux下安装uuid库
  5. html——黑体、斜体、下划线及删除线
  6. windows平台一个高性能、通用型的C++生产者/消费者架构模板
  7. DLL+ ActiveX控件+WEB页面调用例子
  8. OpenCV图像处理使用笔记(五)——图像边界拓展
  9. cenotos 卸载mysql_CentOS 6.2编译安装Nginx1.0.12+MySQL5.5.21+PHP5.3.10 | 系统运维
  10. zigbee的路由器能分配网络地址吗_网络基础知识学习 小白也能变专家