举个栗子

比如挖一个隧道,有2种开工方法
1、只在山的一头挖,直至挖到山的另一头,从而打通隧道,这可以看成是单线程

2、在山的两头挖,同时开工,最后在山的中间接通,从而打通隧道,这感觉肯定比1快了很多,好比多线程

但是2成立的前提是必须有两个工人。而我们的计算机中一般来说只有一个CPU,也就是说只有一个工人。
多线程不过是CPU在不同的时间片之间切换,而表现出齐头并进的样子。

既然挖隧道的人只有一个,虽然我的施工方案是在山的两头开挖,但是由于工作的人只有一个,所以只有让这个人在山的两头跑,挖一会这头再去挖另一头,来回跑是要花费额外时间的(好比线程的切换和调度)。

那么,我们是不是可以说,在单CPU的机器中,多线程反而降低了效率呢?

1.

不能一概而论,你的看多线程在你的程序中为啥而生。在单cpu系统,比如有io的等待,多线程的确能提高效率

2.

如果cpu确实是一个挖山工人,且它工作挖2个小时,然后必须休息1小时;这1小时休息期间如果让它跑到山那头继续挖,效率还是很高的。
现在的程序时间大多花在读取数据上,真正的计算工作花时间还是相对少的,因此cpu很大时间表现都很闲,就像挖土效率高,运土效率低。多线程就是要充分利用它的挖土效率。

3.

pc机不光只一个cpu,cpu和其它硬件设备一起才能完成计算,分工协作,但可能出现其中某个家伙偷懒或效率低,导致大家都等它,闲着的其它设备这个时候可以腾出手来干其它活。单cpu在同一时刻只能干一件事情,这没有问题,问题是它并不是7*24*3600都在干活,其它设备也是同样的道理,多线程的目的可以最大限度的提高硬件设备的利用率。

4.
同一个设备可以同时(并行,互不影响)干几件事情,但同一个设备在同一时刻肯定只能干一件事情,一般我们说并行或串行,都以时间段来看的而不是以时间点来看的,比如你一边上je消遣还一边写代码干活,在一定的时间范围内,你是并行的,但如果这个时间范围你划分得非常非常短,那么你是串行的。

5.
一个cpu可以多线程。但是一个单核的cpu任何时间点,都只能在做一个任务。
如果只是像楼主说的挖隧道这么简单的挖,那么的确多线程没用。
只不过很可惜,计算机不像拿铁锹挖隧道这么简单。

假设每挖5分钟,就需要清理一下挖出来的石土。有一个小车在清理它们。
工人只有一个。
单线程的做法是: 挖5分钟。然后工人停止挖,小车清理石土的5分钟里,工人在等待。
2个线程的做发是: 挖5分钟,小车来清理石土。这5分钟里,工人在另一头挖。

也不是很恰当的比喻。不过至少能说明点问题。
小车清理石土,就相当于磁盘io等相对于cpu计算来说比较慢的操作。

cpu不会等着io的完成,而去执行另一个进程的计算任务。
这边io完成时好象是会发出什么信号来着,忘了。计算机原理都还给老师了,惭愧啊。

如楼主所举的例子,我来解惑。
如果一个机器人代表CUP,哪么这个机器人一天所做的事情,并不都是只挖山。
它还有许多事情要做,比如砍柴,烧水,钓鱼,挖山等等等。
如果按以上划分是 4条进程, 每一个进程大概占用1/4CUP时间。

如果你的设定 在挖山这一快 多设几次同一个任务。 比如设定到 挖山共有3条线程。

哪么 挖山的CUP占用率将达到 1/2 这就是所谓的提高了效率。

现实中的CPU 在大部分时候的 闲置状态的。
因此 开多条线程能提高效率 不如说成是 充分利用了CPU执行时间。

转载于:https://www.cnblogs.com/shann/p/6851889.html

JAVA多线程,真的能提高效率吗相关推荐

  1. 多线程为什么可以提高效率

    JAVA多线程,真的能提高效率吗 举个栗子 比如挖一个隧道,有2种开工方法 1.只在山的一头挖,直至挖到山的另一头,从而打通隧道,这可以看成是单线程 2.在山的两头挖,同时开工,最后在山的中间接通,从 ...

  2. 【已解决】利用 Java 多线程并发编程提高数据处理效率

  3. 多线程处理list_跟大佬聊天,被反问Redis6的多线程真的能提高性能吗?

    转自:http://xiaorui.cc/archives/6918 前言 redis6 出来有段时间了,这个版本有不少的亮点,比如 client cache.acl.resp3.io 多线程等.对于 ...

  4. java多线程累加计数

    java 多线程 计数 题目 给定count=0:让5个线程并发累加到1000: 思路 创建一个类MyRunnable,实现Runnable(继承Thread类也可) 定义一个公共变量count(初始 ...

  5. JAVA用多线程反而变慢了_Java中使用多线程不能明显提高程序效率的一些原因

    java中使用多线程不能明显提高程序效率的一些原因. 使用多个线程来处理多任务的时候,效率肯定是有提高的.但是必须要慎用,否则容易出现问题. 1.多线程主要是为了充分利用多核cpu,大内存这些资源. ...

  6. 多线程在任何情况下均能提高效率吗?

    早段时间在网上看到一篇文章,其中就写了使用多线程模型实现文件的快速搜索.由此使我一直在考虑,多线程模型真的能够提高应用程序的效率吗?如果不能,那么多线程模型能干什么呢? 很多程序员一谈到提高应用程序效 ...

  7. 测试单核cpu和多核cpu执行java多线程任务的效率

    这篇文章就是验证一件事: 只有多核cpu的计算机执行多个线程时才会提高效率(并行),单核cpu执行多个线程不会提高效率(并发). 我选择的任务是:冒泡排序长度30000的int数组 单线程下 我们先测 ...

  8. 提高效率的Java代码优化小技巧

    可以提高效率的Java代码优化小技巧 前言 代码优化 ,一个很重要的课题.可能有些人觉得没用,一些细小的地方有什么好修改的,改与不改对于代码的运行效率有什么影响呢?这个问题我是这么考虑的,就像大海里面 ...

  9. java doc to pdf_java代码doc转pdf提高效率的方法

    publicclassDocTransePdf{staticfinalintwdDoNotSaveChanges=0;//不保存待定的更改.staticfinalintwdFormatPDF=17;/ ...

最新文章

  1. jquery计算表格列,求和
  2. postman对象参数null_postman的几种参数格式
  3. Zend Studio 10正式版破解(2013-02-26更新)
  4. 网申时遇到“补充信息”这一栏,填还是不填?
  5. java 参数 exception_java – 在异常的参数中使用泛型
  6. 站长图卦:每天坚持搬砖 定有美好明天
  7. win服务器系统程序原因
  8. 关于微机开操作票的研究22437
  9. 9.11 strace:跟踪进程的系统调用 、ltrace:跟踪进程调用库函数
  10. c# 通过鼠标点击绘制多边形
  11. java的基本结构_【Java基础】基本程序设计结构
  12. java jdbc封装_JDBC封装-Java(新手)
  13. Java数据结构与算法解析(一)——表
  14. windows下执行tensorflow/models的代码显示No module named ‘object_detection‘
  15. Python拷贝(深拷贝deepcopy与浅拷贝copy)
  16. 小白都能了解的聚类算法之四(谱聚类)
  17. 如何评价路孚特的Datastream工具?
  18. 制作VOC格式的数据集
  19. 51单片机c语言100例百度云,51单片机C语言编程100例.docx
  20. Java实战之管家婆记账系统(3)——数据库表

热门文章

  1. DB2 SQL性能调优秘笈pdf
  2. Lowest Common Ancestor of a Binary Search Tree a Binary Tree
  3. Jmeter调试工具---HTTP Mirror Server
  4. 使用无锁的方式和有锁的方式的程序性能对比
  5. Qt基于TCP网络程序发包封包抽象
  6. 【转】解析.Net框架下的XML编程技术
  7. 如何使用CNN进行物体识别和分类_可能我们之前都想错了:CNN的图像分类策略其实出奇的简单呢!...
  8. python爬虫网络出错怎么办_Python爬虫常见问题
  9. 统计各个函数的耗时_分享一次CMS GC耗时狠高优化过程全记录
  10. Matlab gatool使用方法