前序-------写了两个多小时的文章
提交的时候突然断网,然后再也退不来
草稿保存的也是1个多小时以前的
对着两个风扇吹还一边流汗
实在是整个人都浮躁不已了
耐着性子再次写完
但是质量就已经…………………………
上篇写到
我们在实现多线程广播屏幕截图的时候
因为CPU对多个线程之间的执行顺序是随机的
也就导致了我们发图片的时间间隔的不确定性
从而导致了有些图片从开始发到发完的时间的不确定性
严重降低了系统的实时性
(实际上,在TCP模式下用线程池多线程随机发送图片改良下的远程监控系统,如果服务器端放电影,观测客户端,会发现经常会出现电影“倒着放”的现象,原因也就是这个还有救网络路由时间的不确定性)
要解决这个问题
那么
我们先来研究下JAVA的多线程的并发编程和CPU时钟振荡的关系吧
老规矩,先科普
我们的操作系统在DOS以前都是单任务的
什么是单任务呢?就是一次只能做一件事
你复制文件的时候,就不能重命名了
那么现在的操作系统,我一边在这边写BLOG,一边听歌,一边开着QQ,一边……………………
显然,现在的操作系统都是多任务的操作系统
操作系统对多任务的支持是怎么样的呢?
每打开一个程序,就启动一个进程,为其分配相应空间(主要是运行程序的内存空间)
这其实就支持并发运行了
CPU有个时钟频率,表示每秒能执行CPU指令的次数,
在每个时钟周期内,CPU实际上只能执行一条(或者多条指令)。
操作系统对进程线程进行管理,
轮流(不是按顺序)为每个进程分配很短的一段时间(不一定均分),
然后在每个进程的内部,程序代码自己处理该进程内部线程的时间分配,
多个线程之间相互切换着去执行,
因为切换的时间非常非常短
因此,给人的感觉就是这多个任务、多个线程是在并发运行的
其实,从微观角度来看,
程序的运行还是异步的。
既然都是异步运行的
那么
我们的多线程运行
其实也只是CPU也只是一直在串行的运行着
根本就没有同时运行啊?
既然这样
那么我们多线程又有什么意义呢?
我们又知道
Cpu的运算速度实在是太快了
但是我们I/O的读取速度
网络的传输熟读
数据库的连接--读取速度
我们操作的速度
这些和CPU运算速度比起来
实在是太慢太慢了
因此
在我们进行这些操作的时候
其实CPU在多数情况下还是空闲着的
在这种情况下
我们运行多个任务多个线程
那么在进程A需要进行IO等操作时
CPU空闲就可以进行进程B的相关操作
而不是像串行的那样一定要线程A运行完了才能运行线程B
这也就提高了CPU的利用率
可能有些童鞋会在某些论坛或者什么地方看到
有关java多线程降低CPU运算速度的讨论和说法
这又是怎么回事呢?
其实,这个问题的关键是:
你到底要让CPU干嘛?
如果你让CPU进行的全是内部运算
(没有任何I/O 网络 数据库访问 等等…… )
那么,人为地硬折开CPU内部运算
用来给多个线程"分时"运算
那么CPU运算速度只能更慢
但是
如果你的业务不全是CPU内部运算
还有网络\数据库访问\I/O(如GUImouse操作)等等
则使用多线程有明显的好处
说了这么多
还没最重要的问题呢------多线程的目的
多线程的目的是为了最大限度的利用CPU资源
好了
那么我们继续讨论CPU的问题
CPU中
主频=外频×倍频
主频越高
一个时钟周期里面完成的指令数也越多
当然cpu的速度也就越快了
以前提高CPU运算速度的方法
就是提高CPU主频
但是随着时间的发展
cpu主频在一定程度上
已经达到了物理极限,很难再提高了
那么我们想再继续提高CPU性能应该怎么办呢?
我们知道
传统的CPU
只有一个内核
这个内核也只用同时运行一个线程
现在要提高CPU性能
我们可以在CPU的一个内核上
允许运行多个操作
从硬件级上实现多线程并发运行
为了提高CPU的运算性能
只有使用具有超线程技术的多核CPU
-------------我想这才是JAVA支持多线程并发运行的长久意义所在
说了这么多
再来回到我们的主题吧
java中多线程
1. 关于内存
前面已经说过
在操作系统下
没打开一个程序
系统就会为启动一个进程
为进程分配系统资源(运行程序所需的内存等)
在JAVA中
所有线程都归JVM调度
那么
在JAVA中的线程和系统下的进程在内存使用方面又会有哪些异同呢?
而在Java中所有变量都储存在主存中
对于所有线程都是共享的(在同一进程中)
每条线程都有自己的工作内存(Working Memory)
工作内存中保存的是主存中某些变量的拷贝
线程对所有变量的操作都是在工作内存中进行
线程之间无法相互直接访问
变量传递均需要通过主存完成
但是在程序内部可以互相调用(通过对象方法)
所有线程间的通信相对简单,速度也很快
进程间的内部数据和状态都是相互完全独立的
而进程间通信大多数情况是必须通过网络实现
线程本身的数据通常只有寄存器数据
以及一个程序执行时使用的堆栈
所以线程的切换比进程切换的负担要小
关于线程调度
前面说了
CPU对于各个线程的调度是随机的(分时调度)
在Java程序中,JVM负责线程的调度
线程调度是指------按照特定的机制为多个线程分配CPU的使用权
调度的模式有两种:
分时调度和抢占式调度。
分时调度是所有线程轮流获得CPU使用权,并平均分配每个线程占用CPU的时间;
抢占式调度是根据线程的优先级别来获取CPU的使用权。
JVM的线程调度模式采用了抢占式模式。
既然是抢占调度
那么我们就能通过设置优先级来“有限”的控制线程的运行顺序
注意“有限”一次
好了
实在静不下心
想不起来,写不下去了。
万恶的断网
万恶的自动保存为啥米只保持了1个小时前的?
分享到:
相关推荐
小议税制公平与收入分配.docx
在设计专用集成电路(ASIC)CPU时,计算机辅助设计(CAD)工具起着至关重要的作用。这些工具帮助工程师实现高性能、低功耗和小芯片面积的目标。本文将探讨CPU设计中的关键步骤、遇到的问题以及解决方法,同时也关注...
【小议VC 6.0与Matlab的混合编程技术】 在软件开发中,有时我们需要结合不同工具的优势来创建高效且功能丰富的应用。VC++ 6.0是一款经典的微软开发环境,适合创建复杂的Windows应用程序,而Matlab则以其强大的数值...
这是VC与Labview、Matlab编程论文资料,全部为pdf格式,讲述有VC编程技巧、也有VC与Labview混合编程, VC与matlab混合编程,有365个,约500M,分成4个【独立】压缩包,如果想要全部的论文则需要下载全部压 缩包,...
"AMD最新CPU产品" AMD最新CPU产品,处理器的发展前景如何?在了解AMD最新CPU产品之前,我们需要了解处理器的基本概念。处理器是计算机系统的核心组件,负责执行指令和处理数据。按照处理器的架构可以分为RISC...
Java源文件的声明规则是Java编程的基础,对于初学者来说,理解这些规则至关重要。源文件是Java代码的起点,它包含类的定义、导入语句以及其他相关声明。以下是关于Java源文件声明规则和编程风格的一些关键点: 1. *...
这是VC与Labview、Matlab编程论文资料,全部为pdf格式,讲述有VC编程技巧、也有VC与Labview混合编程, VC与matlab混合编程,有365个,约500M,分成4个【独立】压缩包,如果想要全部的论文则需要下载全部压 缩包,...
这是VC与Labview、Matlab编程论文资料,全部为pdf格式,讲述有VC编程技巧、也有VC与Labview混合编程, VC与matlab混合编程,有365个,约500M,分成4个【独立】压缩包,如果想要全部的论文则需要下载全部压 缩包,...
Linux管理员密码的破解与防止破解的小议.docx
"小议时序调度Timer和Quartz"这个主题主要关注Java平台上的两种常见定时任务框架:Java内置的`java.util.Timer`类和开源的Quartz库。 首先,让我们详细探讨一下`java.util.Timer`。这个类是Java标准库的一部分,它...
小议传统演变与制度创新.pdf
小议知识经济与经济增长.doc
小议期货投资与市场发展.doc
小议量化宽松策略与影响.doc
小议网络工程的设计与建设.pdf
小议初中数学多媒体课件制作.docx
在Java编程语言中,注解(Annotation)是一种强大的工具,用于提供元数据,即关于代码本身的信息,而不直接影响代码的运行。注解可以帮助编译器、构建工具、框架和其他工具理解代码并执行相应的操作。本篇文章主要...
小议传统插花的历史与特征.doc