1.线程和进程
这是一个很基础的知识点,考察的是对基础的掌握情况
- 进程 是系统进行资源分配和调度的一个独立单位
- 线程 是进程的一个实体,一个进程中拥有多个线程,线程之间共享地址空间和其它资源
进一步的,我们需要知道二者的区别,即为啥要多线程?
原因是:线程上下文的切换比进程上下文切换快
原理是因为:线程切换仅需要保存和设置少量的寄存器内容,而进程之间的切换;涉及到当前进程的 CPU 环境的保存和新被调度运行进程的 CPU 环境的设置。
拓展问题:进程之间如何通信?线程之间如何通信?
- 进程之间依靠 管道(pipes) 或者 套接字(sockets) 等IPC进行通信
- 线程之间依靠 JVM 提供的 API,例如 wait()、notify()、notifyAll() 等进行通信
2.为什么要用多线程
很多人包括我在内初学多线程时,都会误以为这个问题的回答 就是 多线程速度快效率高 其实不止这一点,如果你对多线程的特点只能想到这一点,那么说明对于这个问题的理解还不够透彻。
首先我们要明确一点,多线程也是有很多隐患的,不是十全十美的。
(1)资源利用率高
它可以充分的将各个模块都使用起来,我们可以理解为 流水线的工作
举个例子:我们对本地文件的处理过程;
1.读取本地文件A 2S
2.复制本地文件A到新地址 2S
3.删除原地址的本地文件A 2S
4.读取本地文件B 2S
5.复制本地文件B到新地址 2S
6.删除原地址的本地文件B 2S
总计用时 12S
但是如果我们采用多线程的方法来做的话:
1.读取本地文件A 2S
2.复制本地文件A到新地址 读取本地文件B 2S
3.删除原地址的本地文件A 复制本地文件B到新地址 2S
4. 删除原地址的本地文件B 2S
总计时间 8S
类比一下,如果工作量十分庞大的话,多线程在资源利用率上的优势会更加显著
(2)程序设计可能会变得简单
在单线程应用程序中,如果你想编写程序手动处理上面所提到的处理顺序,你必须记录每个文件处理的状态;
但是多线程的话,你可以启动两个线程,每个线程处理一个文件的操作。线程会在等待磁盘读取文件的过程中被阻塞;
其他的线程能够使用CPU去处理以及读取过的文件,进行后续操作;
其结果就是,磁盘总是在繁忙地读取不同的文件到内存中。这会带来磁盘和CPU利用率的提升。而且每个线程只需要记录一个文件,因此这种方式也很容易编程实现。
(3)程序速度快
对数据进行处理时,我们可以将部分操作分配给其他线程,同步进行;
这里我们可以参考一下统筹法的思想:
例如:早上起床,想泡壶茶喝。
当时情况是:开水没有,开水壶、茶壶、茶杯要洗,火已升了,茶叶也有了,怎么办?
方法一 洗水壶,灌水,放在火上;等水烧开的时间,洗茶壶、茶杯,放茶叶;等水烧开了,泡茶喝。
方法二 洗水壶,洗茶壶、茶杯,放茶叶;灌水,放在火上;等水烧开了,泡茶喝。
显然方法一更快一些,这就是多线程的好处。
注意点:多线程不一定是最快的,因为线程有创建和上下文切换的开销。
3.线程的状态
图片转自:http://zy19982004.iteye.com/blog/1626916
未完待续。。。