JAVA多线程,真的能提高效率吗

举个栗子

比如挖一个隧道,有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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/372197.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Java 8:测试Lambda水

Java 8大约有一年的时间了,它具有我非常期待的语言功能: Lambda Expression 。 令人遗憾的是,另一个重要功能Java平台模块已延迟到Java9。但是,将lambda表达式(或闭包)添加到该语言中将使Java编程变得更好。…

java定义js函数_JS中可以先使用函数,然后再定义.

首先要说明的,下面这种方式是对的,虽然不知道为什么,很奇怪为什么可以先使用,再定义,希望有了解的人可以给个说法.hello(www.openj.cn);function hello(name){alert("hello " name)};本文首发于 http://blog.openj.cn下面的这种定义函数方式,对于写一些比较复杂的代码…

基于阀值的工作流引擎设计

最近在做工作流处理流程部分的工作,顺便研究了一下工作流引擎的一些设计理念和原理。由于以前接触过人工智能神经网络的一些东西,发现工作流引擎和神经网络还是颇有一些相似之处,都是满足一定的条件下向下一个节点传递。在神经网络的神经元中…

Git之安装管理

1.Git安装部署 Git是分布式的版本控制系统,我们只要有了一个原始Git版本仓库,就可以让其他主机克隆走这个原始版本仓库,从而使得一个Git版本仓库可以被同时分布到不同的主机之上,并且每台主机的版本库都是一样的,没有主…

Java执行程序服务类型

ExecutorService功能是Java 5附带的。它扩展了Executor接口,并提供了线程池功能来执行异步简短任务。 使用Java 6提供的ExecutorService接口有五种异步执行任务的方法。 ExecutorService execService Executors.newCachedThreadPool(); 这…

MySQL的主动优化和被动优化_MySQL“被动”性能优化汇总!

年少不知优化苦,遇坑方知优化难。 ——村口王大爷本文内容导图如下:我之前有很多文章都在讲性能优化的问题,比如下面这些:当然,本篇也是关于性能优化的,那性能优化就应该一把梭子吗?还是要符合一…

python2

一、管理库的安装 安装pip 提示报错:安装pip提示No module named setuptools Windows环境下Python默认是没有安装setuptools这个模块的,这也是一个第三方模块。下载地址为http://pypi.python.org/pypi/setuptools。下载后直接运行ez_setup.py 参考地址&…

Java Mybatis

Mybatis转载于:https://www.cnblogs.com/leading-index/p/6853031.html

Java例外:java lang NoSuchMethodError

如果查看错误消息java.lang.NoSuchMethodError,您可能会理解Java虚拟机正在尝试向我们表明您调用的方法在类或接口中不可用。 您还可能在执行没有公共static void main()方法的类时抛出此错误。要了解其背后的原因,请阅读本文。 …

【图】最短路径——Floyed算法和Dijkstra算法

最短路径问题(floyed.cpp dijkstra.cpp) 题目描述平面上有n个点(n<100)&#xff0c;每个点的坐标均在-10000&#xff5e;10000之间。其中的一些点之间有连线。若有连线&#xff0c;则表示可从一个点到达另一个点&#xff0c;即两点间有通路&#xff0c;通路的距离为两点间的…

java的empty_Java Stack empty()方法与示例

堆栈类empty()方法empty()方法在java.util包中可用。empty()方法用于检查此堆栈是否为空。empty()方法是一个非静态方法&#xff0c;只能通过类对象访问&#xff0c;如果尝试使用类名称访问该方法&#xff0c;则会收到错误消息。在检查空状态时&#xff0c;empty()方法不会引发…

Java并发– CyclicBarrier示例

Java中的CyclicBarrier是JDK 5中java.util.Concurrent包中引入的同步器&#xff0c;以及其他并发实用程序&#xff08;如Counting Semaphore &#xff0c; BlockingQueue &#xff0c; ConcurrentHashMap等&#xff09;。CyclicBarrier与CountDownLatch类似&#xff0c;我们在上…

java i o总结_Java I/O 总结

一、IO流的三种分类方式1.按流的方向分为&#xff1a;输入流和输出流2.按流的数据单位不同分为&#xff1a;字节流和字符流3.按流的功能不同分为&#xff1a;节点流和处理流二、IO流的四大抽象类&#xff1a;字符流&#xff1a;Reader Writer字节流&#xff1a;InputStream(读数…

try...catch 语句

一般情况下&#xff0c;我们很少用到 try...catch 语句&#xff0c;但是有时候为了测试代码中的错误&#xff0c;也有可能会用到。小白我也在工作中用到过。那么好的程序设计&#xff0c;什么时候会用到呢&#xff1f; try...catch 一般用来捕获宿主对象或者ECMAScript抛出的异…

用Mockito回答

在编写单元测试时 &#xff0c;必须牢记不要依赖外部组件。 为了避免这种情况&#xff0c;我们使用了模拟框架&#xff0c;对我来说&#xff0c;最容易使用的是Mockito 。 在本文中&#xff0c;我们将看到在Mockito中使用的一种“高级”技术&#xff0c;可以使用Answer接口在模…

java三板斧_Java 枚举使用三板斧

Java 枚举使用三板斧1 定义public enum CountryEnums {ONE(1,"韩"),TWO(2,"魏"),THREE(3,"楚"),FOUR(4,"燕"),FIVE(5,"赵"),SIX(6,"齐");private Integer retCode;private String retMsg;// 枚举的构造方法是 pri…

假装这些是MyEclipse的快捷键(1)

Java快捷键 Alt / 代码自动补全Alt Shift S 功能菜单 Ctrl 1 代码自动修正Ctrl / 单行注释/取消Ctrl O 查看类的所有方法Ctrl T 查看类的集成架构图Ctrl Shift / 多行注释Ctrl Shift \ 取消多行注释Ctrl Shift F 代码格式化转载于:https://www.cnblogs.com/swordt…

JasperReports JSF插件用例–简单列表报告

这是JasperReports JSF插件系列的第一篇“用例文章” &#xff0c;我将专注于一个简单的需求&#xff0c;并且我将进一步深入。 起点是我们已经为图书商店完成的项目设置&#xff0c;我将向其中添加一个列表&#xff0c;其中包含在数据库中注册的其他图书&#xff0c;该列表也将…

2016.10.17先占坑

2016.10.17先占坑转载于:https://www.cnblogs.com/amurzet/p/5978986.html

ER图流程图

ER图&#xff1a;ER图分为实体、属性、关系三个核心部分。实体是长方形体现&#xff0c;而属性则是椭圆形&#xff0c;关系为菱形。 图书馆管理系统流程图&#xff08;图片源于网上&#xff09;&#xff1a;对于程序员来说&#xff0c;我们要知道&#xff1a;整个系统中&#x…