1. 进程:
1) 进程是指正在内存中执行的程序;
2) 注意进程和程序之间的区别:
i. 程序是保存在磁盘中静态的指令集;
ii. 进程是程序被加载入内存后正在动态执行的指令集合;
iii. 因此进程拥有自己的生命周期和不同的状态;
3) 进程的独立性:
i. 进程是系统进行资源分配和调度的基本的、独立的单位;
ii. 进程有自己独立的资源,有自己独立的地址空间,在没有本进程允许的情况下不可以直接被其它进程访问;
4) 进程的并发性:进程可以在单处理器上并发执行;
2. 并发性和并行性:
1) 并发性是指多进程在处理器上轮换执行,即宏观并行、微观串行(比如多个进程同时共用一个CPU核);
2) 并行性是指多进程在处理器上同时执行,互不影响,即微观也并行的彻底的并行(比如一个进程占用一个CPU核);
3. 线程:
1) 一个进程中还可以分出多个并发执行的顺序执行流(子任务),那么每个子任务就是一个线程;
2) 线程是进程的组成部分,因此每个线程必须要有自己的父进程(有且仅有一个);
3) 线程在进程中也是独立的单位,可以拥有自己的堆栈、局部变量、计数器等,但线程享有进程的全部资源,即每个线程都可以访问到父进程的全部资源,即线程除了拥有自己的资源之外还享有进程的资源,而这部分进程的资源就是属于所有线程的公共资源,大家都可以访问到,因此就会遇到一个问题,如果各线程都是访问一个进程中的公共资源会不会发生冲突?这当然会有一套机制来避免这种冲突;
4) 线程是独立并发运行的,一个正在运行的线程自己并不知道是否还有其他线程的存在,即线程的执行是抢占式的,在任何时候都可能被挂起;
5) 线程的调度和管理是由进程本身负责的,也就是说这些工作需要用户自己在进程中用代码来实现(控制),而不是交给操作系统来管理;
6) 一个进程至少要包含一个线程,这就是主线程,之前编写的程序都是属于这种单线程程序,即一个进程里只有一个主线程;
3. 多线程的优势:
1) 线程之间共享数据方便(线程间通信),比进程间通信方便,可以直接使用父进程中的数据共享区;
2) 线程比进程高效,因为多线程之间共享父进程内存,开辟线程仅仅就是在父进程的内存空间中给一段地址空间而已,非常方便,但开辟进程需要操作系统冲洗分配系统资源,代价大得多;
3) Java内置了多线程功能,在虚拟机底层就支持多线程;
4) 多线程的应用:
i. 浏览器同时下载多个资源;
ii. Web服务器(Apache)等同时相应多个用户的请求;
iii. Java虚拟机本身就在后台开启一个垃圾回收线程;
iv. AWT、Swing、MFC等GUI界面完全依赖多线程;