2 m1 G7 @5 z! p6 W0 n e2 E3 g- S9 C& r
( J; g2 I2 \. R5 K: {6 L Java通用流行框架大全- s, `) n3 u0 D2 @+ n
并发历史 Q3 {5 M4 |( U2 x" b$ n, h在计算机最早期的时候,没有操作系统,执行程序只需要一个过程,那就是从头到尾依次执行。任何资源都会为这个程序服务,这必然就会存在 浪费资源 的情况。 # O4 v% h( M9 [; r# I: R, g 1 L5 `( F3 o1 j: p4 | 9 J/ L/ |- a8 [# n+ k这里说的浪费资源指的是资源空闲,没有充分使用的情况。 \$ F5 }, N: @6 O+ b) @( B4 n# U) u O. }1 C
* _$ J( O' e# R0 d2 h7 C操作系统为我们的程序带来了 并发性,操作系统使我们的程序同时运行多个程序,一个程序就是一个进程,也就相当于同时运行了多个进程。 " |: i, f3 f1 ]: [9 @6 z* X # U; g* |4 @. D. { ) k! c: |. `: Z# x操作系统是一个并发系统,并发性是操作系统非常重要的特征,操作系统具有同时处理和调度多个程序的能力,比如多个 I/O 设备同时在输入输出;设备 I/O 和 CPU 计算同时进行;内存中同时有多个系统和用户程序被启动交替、穿插地执行。操作系统在协调和分配进程的同时,操作系统也会为不同进程分配不同的资源。 - `6 l" R8 q* N* M8 f 4 F- [5 I, \! V0 L: m _ z) z, L% S5 m4 j
操作系统实现多个程序同时运行解决了单个程序无法做到的问题,主要有下面三点 5 I! s9 I, Z; `2 U3 M3 S8 i1 j: Q8 G/ i
. u+ @& I1 _$ V7 b资源利用率,我们上面说到,单个进程存在资源浪费的情况,举个例子,当你在为某个文件夹赋予权限的时候,输入程序无法接受外部的输入字符,只能等到权限赋予完毕后才能接受外部输入。综合来讲,就是在等待程序时无法执行其他工作。如果在等待程序的同时可以运行另一个程序,那么将会大大提高资源的利用率。(资源并不会觉得累)因为它不会划水~3 J' H3 @, L8 e2 g2 h6 Y2 C
公平性,不同的用户和程序对于计算机上的资源有着同样的使用权。一种高效的运行方式是为不同的程序划分时间片使用资源,但是有一点需要注意,操作系统可以决定不同进程的优先级,虽然每个进程都有能够公平享有资源的权利,但是每次前一个进程释放资源后的同时有一个优先级更高的进程抢夺资源,就会造成优先级低的进程无法获得资源,久而久之会导致进程饥饿。% J( J9 \% S) b
便利性,单个进程是无法通信的,通信这一点我认为其实是一种避雷针策略,通信的本质就是信息交换,及时进行信息交换能够避免信息孤岛,做重复性的工作;任何并发能做的事情,顺序编程也能够实现,只不过这种方式效率很低,它是一种 阻塞式 的。$ a$ R: h& {7 E5 h
但是,顺序编程(也称为串行编程)也不是一无是处的,串行编程的优势在于其直观性和简单性,客观来讲,串行编程更适合我们人脑的思考方式,但是我们并不会满足于顺序编程,we want it more!!! 。资源利用率、公平性和便利性促使着进程出现的同时也促使着线程的出现。 # ?! u4 Q4 D& t, O! z2 T8 t( ~9 R k8 m1 }/ |4 R% z
; f- Y1 N+ \; l! X( ?( \2 P# F- b
如果你还不是很理解进程和线程的区别的话,那么我就以我多年操作系统的经验(吹牛逼,实则半年)来为你解释一下:进程是一个应用程序,而线程是应用程序中的一条顺序流。 + @) }& z6 }4 ]5 B+ `8 c; e2 b3 g; Z, ^' `4 M& d; u. K
0 H E8 p& H* G
0 h5 T0 E$ u8 P: j, C/ p
* M/ t! b& z0 n) L$ A+ y
; ?, t7 _, U9 ~8 o0 D: I
4 }0 ]4 z" g& x: [5 ~+ N" f 4 r8 B" j. G# q6 f0 F$ ^4 H. K4 x" ?: j$ n6 p
2 y! I( f: [; i. R6 b( z- q) k7 {9 C; c
1 V* e1 g% k& j% r
线程会共享进程范围内的资源,例如内存和文件句柄,但是每个线程也有自己私有的内容,比如程序计数器、栈以及局部变量。下面汇总了进程和线程共享资源的区别 . ^1 Z @. X: m7 p/ W9 ^* I& v9 F n$ w! n# q+ _
. g2 `$ D$ s0 d& q' S* t3 Q" g: k8 Q9 t* n+ u+ _; A
# z' ^* Z- h! Z: Y. r
+ n4 D2 Q6 C) p' R4 d- n9 {
6 `3 p' ^. \& H6 P7 q
线程被描述为一种轻量级的进程,轻量级体现在线程的创建和销毁要比进程的开销小很多。' C$ H' Y# v) j+ u% B o$ s- `
! r0 F" T/ p1 @6 y5 _
i b' Q1 W9 P7 F& I/ E Y. {
注意:任何比较都是相对的。, D0 H, k- v7 |1 k: t, L& Y/ H F
/ V: W3 x' t4 D9 a9 T( M- ]1 J" q) q" X% r. l B
在大多数现代操作系统中,都以线程为基本的调度单位,所以我们的视角着重放在对线程的探究。. C+ V) ~, F' V- E0 @2 X3 m
6 M% t% e0 {( g5 A. c) X# H6 x- P" |0 I% {( x
线程9 t7 K0 H/ B: m* V5 a6 u
优势和劣势 / P }- J; T- T( L合理使用线程是一门艺术,合理编写一道准确无误的多线程程序更是一门艺术,如果线程使用得当,能够有效的降低程序的开发和维护成本。. R- ~. ~: O, s6 S4 R
7 c9 C9 n. e* y8 U% X
7 G4 N. s1 R. g7 j
在 GUI 中,线程可以提高用户界面的响应灵敏度,在服务器应用程序中,并发可以提高资源利用率以及系统吞吐率。( H$ m3 S0 p6 Q) M: d
5 e2 \+ H' J. L% Y. A- C