举例说明进程:html
(1)想象一位有一手好厨艺的计算机科学家正在为他的女儿烘焙生日蛋糕; (2)他有作生日蛋糕的食谱,厨房里有所须要的原料:面粉、鸡蛋、糖等。 (3)在这个比喻中,作蛋糕的食谱就是程序; (4)计算机科学家就是处理器cpu; (5)而作蛋糕的各类原料就是输入数据。 (6)进程就是厨师阅读食谱、取来各类原料、以及烘焙蛋糕等一系列动做的总和。 (7)如今假设计算机科学家的儿子哭着跑来出来,说他的头被一只蜜蜂蛰了; (8)计算机科学家就记录下他照着食谱作到了哪儿了,也就是保存进程的当前状态; (9)而后拿出一本急救手册,按照其中的指示处理蛰伤; (10)这时咱们就看处处理器从一个进程切换到另外一个高优先级的进程; (11)每一个进程拥有各自的程序(食谱和急救手册); (12)当蜜蜂蛰伤被处理完成以后,这位计算机科学家又回来作蛋糕; (13)从他离开时的那一步继续进行下去。
举例说明线程:java
(1)假设一个文本程序,须要接收键盘输入,将内容显示在屏幕上,还须要保存信息到硬盘中。 (2)若只有一个进程,势必形成同一时间只能干一件事的尴尬,就是说当保存时,不能键盘输入; (3)如有多个进程,每一个进程负责一个任务; (4)进程A负责键盘输入,进程B负责将内容显示在屏幕上,进程C负责保存内容到硬盘中; (5)这里A、B、C间的协做涉及到了进程通讯问题,并且它们有共同都须要的内容:文本内容; (6)不停的切换会形成性能上的损失。 (7)如有一种机制,可使A、B、C能够共享资源; (8)这样上下文切换所须要保存和恢复的内容就少了; (9)同时也能够减小通讯所带来的性能损耗。 (10)这种机制,就是线程。
进程与线程的关系:session
(1)一个线程只能属于一个进程,而一个进程能够有多个线程,但至少有一个线程 (2)资源分配给进程,同一进程的全部线程共享该进程的全部资源 (3)cpu分给线程,即真正在cpu上运行的是线程
jvm启动是多线程的:多线程
(1)由于在jvm启动的时候垃圾回收线程也要启动,不然很容易会出现内存溢出; (2)如今的垃圾回收线程加上前面的主线程,最少启动了两个线程,因此,jvm的启动是多线程的。
注意:并发
(1)就绪状态是进入到运行状态的惟一入口 (2)线程想要进入到运行状态执行,首先必须处于就绪状态中 (3)根据阻塞产生的缘由,阻塞状态又能够分为三种: 【1】等待阻塞:运行状态中的线程执行wait()方法,使本线程进入到等待阻塞状态 【2】同步阻塞:线程在获取synchronized同步锁失败(由于锁被其余线程占用),它会进入同步阻塞状态 【3】其余阻塞:经过调用线程的sleep()或join()或发出了I/O请求时,线程会进入到阻塞状态。当sleep()状态超时、join()等待线程终止或者超时、或者I/O处理完毕时,线程从新转入就绪状态
monitor:jvm
(1)是应用于同步问题的人工线程调度工具 (2)java的每一个对象都有一个监视器,来监测并发代码的重入。 (3)在非多线程编码时该监视器不发挥做用,反之若是在synchronized范围内,监视器发挥做用
ThreadLocal类:工具
(1)用于保存线程的对立变量 (2)当使用ThreadLocal维护变量时,ThreadLocal为每一个使用该变量的线程提供独立的变量副本,因此每个线程均可以独立的改变本身的副本,而不会影响其余线程所对应的副本。 (3)经常使用与用户登录控制,如记录session信息。