理解Java的多线程技术

CPU

CPU个数即CPU芯片个数
CPU的核心数是指物理上核,也就是硬件上存在着几个核心。比如,双核就是包括2个相对独立的CPU核心单元组,四核就包含4个相对独立的CPU核心单元组。


线程数是一种逻辑的概念,简单地说,就是模拟出的CPU核心数。比如,可以通过一个CPU核心数模拟出2线程的CPU,也就是说,这个单核心的CPU被模拟成了一个类似双核心CPU的功能。我们从任务管理器的性能标签页中看到的是两个CPU。 比如Intel赛扬G460是单核心,双线程的CPU,Intel 酷睿i3 3220是双核心 四线程,Intel 酷睿i7 4770K是四核心 八线程 ,Intel 酷睿i5 4570是四核心 四线程等等。 对于一个CPU,线程数总是大于或等于核心数的。一个核心最少对应一个线程,但通过超线程技术,一个核心可以对应两个线程,也就是说它可以同时运行两个线程。
多核CPU不等于多CPU,主要是在一个cpu的内部,核之间进行通信效率要高很多,功耗什么都好。

并行和并发

并发和并行是两个概念,并行值在同一时刻,有多个指令在多个处理器上同时执行,而并发指在同一时刻只能有一条指令执行,但多个进程指令在被快速轮换执行,使得在宏观上具有多个进程同时执行的效果。

CPU处理线程和进程

单核CPU处理

单核就是一个CPU,比较好理解。

单进程多线程

在一个应用程序里,添加键盘、鼠标功能,程序启动后就是单进程2线程,如果键盘线程获取了锁,那么这个线程将获取CPU的运行时间,其他线程将被阻塞。但CPU始终处于运行状态,影响计算时间的其实只是加锁和解锁的时间。并不会发生CPU空闲的现象。cpu利用率100%。
线程阻塞:一般是被动的,在抢占资源中得不到资源,被动的挂起在内存,等待某种资源或信号量(即有了资源)将他唤醒。(释放CPU,不释放内存)。

多进程多线程

将键盘、鼠标分别写出两个独立的应用程序,独立运行,与上面不同的是,进程间通信如果要交换数据很麻烦,需要很多步骤,效率低

多核CPU处理

多核CPU还是一个CPU,就好像在一个集成电路里面放了很多cpu在里面变成一个大cpu,是多CPU的替代解决方案。好处就是CPU可以进行并行运算,而不是并发运算了。假设现在有四个核,1,2,3,4,每个核虚拟出两个逻辑线程,那最多同时8个线程运行。
通过超线程技术可以实现单个物理核实现线程级别的并行计算,但是比不上性能两个物理核。
核的作用就是通过进程调度提高CPU的利用率,将一个CPU虚拟成多个,实现多个进程的并发执行。

单进程多线程处理

一个进程的多个线程可以跨核去运行,但是用的是一个共享空间和各种资源。
还是上面的那种情况,在一个应用程序里,添加键盘、鼠标功能,程序启动后就是单进程2线程,此时多核CPU和单核CPU相比,因为进程在一个核里,如果键盘的线程阻塞了整个cpu,其他核都没被使用。
假如没有阻塞时,比如用QQ的一个进程在某一个核申请完资源后,进程可以调度cpu的线程并行能力,达到A进程的线程1在逻辑线程1去放歌,B线程在逻辑线程3发消息,此时多核CPU效率比单核快很多。

多进程多线程处理

比如还是,QQ是一个程序,没有打开QQ就不存在进程,当运行起来的时候他里面会有很多进程,每个进程里有很多线程。每一个进程只能放进一个CPU中的某一个核,比如现在有1,2,3,4四个核。QQ的某个进程在核1,另一个进程在核2,那就是直接并行,互不打扰。

多核线程数量选择

计算密集型

程序主要为复杂的逻辑判断和复杂的运算。
cpu的利用率高,不用开太多的线程,开太多线程反而会因为线程切换时切换上下文而浪费资源。

IO密集型

程序主要为IO操作,比如磁盘IO(读取文件)和网络IO(网络请求)。
因为IO操作会阻塞线程,cpu利用率不高,可以开多点线程,阻塞时可以切换到其他就绪线程,提高cpu利用率。

java多线程的优势

线程在程序中是独立的、并发的执行流,线程之间不像进程之间那么隔离,他们共享内存、文件句柄和其他每个进程应有的状态。
系统创建一个进程,必须为该进程重新分配系统资源,创建线程则简单的多,因此使用多线程进行并发比多进程实现并发的性能要高的多。
总结起来,多线程编程的优点有下面几个:
1.内存,进程不共享,线程共享。
2.创建效率,进程因为有资源分配效率低
3.java内置了多线程功能支持,而不是单纯的使用操作系统的调度方式,开发实现简单。

发表评论

电子邮件地址不会被公开。