java中的多线程知识的总结分析
进程概述
进程:正在运行的程序,是系统进行资源分配和调用的独立单位。
进程就是一个程序在一个数据集上的一次动态执行过程。
进程一般由程序、数据集、进程控制块三部分组成。
每一个进程都有它自己的内存空间和系统资源。
我们编写的程序用来描述进程要完成哪些功能以及如何完成;
数据集则是程序在执行过程中所需要使用的资源;
进程控制块用来记录进程的外部特征,描述进程的执行变化过程,系统可以利用它来控制和管理进程,他是系统感知进程存在的唯一标识。
举例说明进程:
(1)想象一位有一手好厨艺的计算机科学家正在为他的女儿烘焙生日蛋糕;
(2)他有做生日蛋糕的食谱,厨房里有所需要的原料:面粉、鸡蛋、糖等。
(3)在这个比喻中,做蛋糕的食谱就是程序;
(4)计算机科学家就是处理器cpu;
(5)而做蛋糕的各种原料就是输入数据。
(6)进程就是厨师阅读食谱、取来各种原料、以及烘焙蛋糕等一系列动作的总和。
(7)现在假设计算机科学家的儿子哭着跑来出来,说他的头被一只蜜蜂蛰了;
(8)计算机科学家就记录下他照着食谱做到了哪儿了,也就是保存进程的当前状态;
(9)然后拿出一本急救手册,按照其中的指示处理蛰伤;
(10)这时我们就看到处理器从一个进程切换到另一个高优先级的进程;
(11)每个进程拥有各自的程序(食谱和急救手册);
(12)当蜜蜂蛰伤被处理完成之后,这位计算机科学家又回来做蛋糕;
(13)从他离开时的那一步继续进行下去。
线程概述
线程的出现是为了降低上下文切换的消耗,提高系统的并发性。
线程突破了一个进程只能干一件事的缺陷,使到进程内并发成为可能。
举例说明线程:
(1)假设一个文本程序,需要接收键盘输入,将内容显示在屏幕上,还需要保存信息到硬盘中。
(2)若只有一个进程,势必造成同一时间只能干一件事的尴尬,就是说当保存时,不能键盘输入;
(3)若有多个进程,每个进程负责一个任务;
(4)进程A负责键盘输入,进程B负责将内容显示在屏幕上,进程C负责保存内容到硬盘中;
(5)这里A、B、C间的协作涉及到了进程通信问题,而且它们有共同都需要的内容:文本内容;
(6)不停的切换会造成性能上的损失。
(7)若有一种机制,可以使A、B、C可以共享资源;
(8)这样上下文切换所需要保存和恢复的内容就少了;
(9)同时也可以减少通信所带来的性能损耗。
(10)这种机制,就是线程。
线程也叫轻量级进程。
它是一个基本的cpu执行单元,也是程序执行过程中的最小单元。
由线程id、程序计数器、寄存器集合和堆栈共同组成
线程的引入减小了程序并发执行时的开销,提高了操作系统的并发性能。
线程没有自己的系统资源。
进程与线程的关系
进程是计算机中的程序关于某数据集合上的一次运行活动。
进程是系统进行资源分配和调度的基本单位,是操作系统结构的基础
线程是进程的一个实体,是cpu调度和分派的基本单位
线程是比进程更小的能独立运行的基本单位
进程与线程的关系:
(1)一个线程只能属于一个进程,而一个进程可以有多个线程,但至少有一个线程
(2)资源分配给进程,同一进程的所有线程共享该进程的所有资源
(3)cpu分给线程,即真正在cpu上运行的是线程
java程序运行原理
java命令会启动java虚拟机,即启动JVM,等于启动了一个应用程序,也就是启动了一个进程;
该进程会自动启动一个主线程;
然后主线程去调用某个类的main方法。
所以main方法运行在主线程中,在此之前的所有程序都是单线程的
jvm启动是多线程的:
(1)因为在jvm启动的时候垃圾回收线程也要启动,否则很容易会出现内存溢出;
(2)现在的垃圾回收线程加上前面的主线程,最少启动了两个线程,所以,jvm的启动是多线程的。
涉及到多线程的内容分成几部分:
扎好马步:线程的状态
内功心法:每个对象都有的方法(机制)
太祖长拳:基本线程类
九阴真经:高级多线程控制类
扎好马步:线程的状态(五种)
New:新建状态,当线程对象创立后,即进入了新建状态,如:Thread t = new MyThread()
Runnable:就绪状态,当调用线程对象的start()方法(t.start()),线程就进入就绪状态。处于就绪状态的线程,只是说明此线程已经做好了准备,随时等待cpu调度执行,并不是说执行了t.start()此线程立即就会执行
Running:运行状态,当cpu开始调度处于就绪状态的线程时,此时线程才得以真正执行,即进入到运行状态。
Blocked:阻塞状态,处于运行状态中的线程由于某种原因,暂时放弃对cpu的使用权,停止执行,此时进入阻塞状态,直到其进入到就绪状态,才有机会再次被cpu调用以进入到运行状态
Dead:死亡状态,线程执行完了或者因异常退出了run()方法,该线程结束生命周期
-
注意:
(1)就绪状态是进入到运行状态的唯一入口
(2)线程想要进入到运行状态执行,首先必须处于就绪状态中
(3)根据阻塞产生的原因,阻塞状态又可以分为三种:
【1】等待阻塞:运行状态中的线程执行wait()方法,使本线程进入到等待阻塞状态
【2】同步阻塞:线程在获取synchronized同步锁失败(因为锁被其他线程占用),它会进入同步阻塞状态
【3】其他阻塞:通过调用线程的sleep()或join()或发出了I/O请求时,线程会进入到阻塞状态。当sleep()状态超时、join()等待线程终止或者超时、或者I/O处理完毕时,线程重新转入就绪状态
内功心法:每个对象都有的方法
synchronized、wait、notify是任何对象都具有的同步工具
monitor:
(1)是应用于同步问题的人工线程调度工具
(2)java的每个对象都有一个监视器,来监测并发代码的重入。
(3)在非多线程编码时该监视器不发挥作用,反之如果在synchronized范围内,监视器发挥作用
wait/notify:二者都必须存在于synchronized块中
并且这三个关键字针对的是同一个监视器,这意味着wait之后,其他线程可以进入同步块执行
太祖长拳:基本线程类
Thread类
Runnable类
Callable类
九阴真经:高级多线程控制类
ThreadLocal类:
(1)用于保存线程的对立变量
(2)当使用ThreadLocal维护变量时,ThreadLocal为每个使用该变量的线程提供独立的变量副本,所以每一个线程都可以独立的改变自己的副本,而不会影响其他线程所对应的副本。
(3)常用与用户登陆控制,如记录session信息。
原子类(AtomicInteger/AtomicBoolean)
Lock类:ReentrantLock/ReentrantReadWriteLock.ReadLock/ReentrantReadWriteLock.WriteLock
以上就是java中的多线程知识的总结分析的详细内容,更多请关注其它相关文章!
下一篇: java虚拟机--线程安全与锁优化