本篇文章给大家带来的内容是关于 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中的多线程知识的总结分析的详细内容。更多信息请关注PHP中文网其他相关文章!

本文讨论了使用Maven和Gradle进行Java项目管理,构建自动化和依赖性解决方案,以比较其方法和优化策略。

本文使用Maven和Gradle之类的工具讨论了具有适当的版本控制和依赖关系管理的自定义Java库(JAR文件)的创建和使用。

本文讨论了使用咖啡因和Guava缓存在Java中实施多层缓存以提高应用程序性能。它涵盖设置,集成和绩效优势,以及配置和驱逐政策管理最佳PRA

本文讨论了使用JPA进行对象相关映射,并具有高级功能,例如缓存和懒惰加载。它涵盖了设置,实体映射和优化性能的最佳实践,同时突出潜在的陷阱。[159个字符]

Java的类上载涉及使用带有引导,扩展程序和应用程序类负载器的分层系统加载,链接和初始化类。父代授权模型确保首先加载核心类别,从而影响自定义类LOA

本文解释了用于构建分布式应用程序的Java的远程方法调用(RMI)。 它详细介绍了接口定义,实现,注册表设置和客户端调用,以解决网络问题和安全性等挑战。

本文详细介绍了用于网络通信的Java的套接字API,涵盖了客户服务器设置,数据处理和关键考虑因素,例如资源管理,错误处理和安全性。 它还探索了性能优化技术,我

本文详细介绍了创建自定义Java网络协议。 它涵盖协议定义(数据结构,框架,错误处理,版本控制),实现(使用插座),数据序列化和最佳实践(效率,安全性,维护


热AI工具

Undresser.AI Undress
人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover
用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool
免费脱衣服图片

Clothoff.io
AI脱衣机

AI Hentai Generator
免费生成ai无尽的。

热门文章

热工具

MinGW - 适用于 Windows 的极简 GNU
这个项目正在迁移到osdn.net/projects/mingw的过程中,你可以继续在那里关注我们。MinGW:GNU编译器集合(GCC)的本地Windows移植版本,可自由分发的导入库和用于构建本地Windows应用程序的头文件;包括对MSVC运行时的扩展,以支持C99功能。MinGW的所有软件都可以在64位Windows平台上运行。

PhpStorm Mac 版本
最新(2018.2.1 )专业的PHP集成开发工具

SublimeText3汉化版
中文版,非常好用

SublimeText3 英文版
推荐:为Win版本,支持代码提示!

禅工作室 13.0.1
功能强大的PHP集成开发环境