IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 开发测试 -> Java并发基础 -> 正文阅读

[开发测试]Java并发基础

进程:一个内存中运行的应用程序,一个进程有自己独立的内存空间,一个进程可以有多个线程。
线程:一个进程中的执行任务(控制单元),负责当前进程中程序的执行,一个进程至少有一个线程,一个进程可以运行多个线程,多个线程共享数据。

多线程基础

线程和进程的区别

线程具有许多传统进程所具有的特征,所以又称为轻型进程或者进程元;而把传统的进程称为重型进程,它相当于只有一个线程的任务。在引入了线程的操作系统中,通常一个进程有若干个线程,至少包含一个线程。

进程线程
根本区别进程是操作系统资源分配的基本单位线程是处理器任务调度和执行的基本单位
资源开销每个进程都有独立的代码和数据空间(程序上下文),程序之间的切换会有较大的开销线程可以看作轻量级进程,同一类线程共享代码和数据空间,每个线程都有自己独立的运行栈和程序计数器,线程之间切换的开销小。
包含关系如果一个进程内有多个线程,则执行过程不是一条线的,而是多条线(线程)共同完成的。线程是进程的一部分,所以线程也被称为轻量级进程。
内存分配进程之间的地址空间和资源是相互独立的。同一进程的线程共享本进程的地址空间和资源。
影响关系一个进程崩溃之后,在保护模式下不会对其他进程产生影响。一个线程崩溃整个进程都会死掉,所以多进程要比多线程健壮。
执行过程每个独立的进程都有程序运行的入口,顺序执行序列和程序出口。线程不能独立运行,必须依存在应用程序中,由应用程序提供多个线程执行控制,两者均可并发执行。

创建线程的三种方式对比

采用Runnable.Callable接口创建多线程

优势:线程类只是实现了Runnable接口或者Callable接口,还可以继承其他类。在这种情况下,多个线程可以共享同一个target对象,所以非常适合多个相同线程来处理同一份资源的情况,从而可以将CPU、代码和数据分开,形成清晰的模型,较好的体现了面向对象的思想。
劣势:编程较复杂,如果要访问当前线程,必须使用Thread.currentThread( )方法。

使用Thread类的方式创建多线程

优势:编写简单,如果要访问当前线程,不需使用Thread.currentThread( )方法,直接使用this即可获得当前线程。
劣势:线程类已经继承了Thread类,所以不能在继承其他父类。

Runnable和Callable的区别

  • Callable规定重写的方法是call( ),Runnable规定重写的方法是run( )。
  • Callable的任务执行后可返回值,而Runnable的任务不能有返回值。
  • Call方法可以抛出异常,run方法不可以。
  • 运行Callable任务可以拿到一个Future对象,表示异步计算的结果,它提供了检查计算是否完成的方法,以等待计算的完成,并检索计算的结果,通过Future对象可以了解任务执行情况,可以取消任务的执行,还可获得执行结果。

为什么要使用多线程?

  • 从计算机底层来说,线程可以比作是轻量级的进程,是程序执行的最小单位,线程间的切换和调度的成本远远小于进程。另外,多核CPU时代意味着多个线程可以同时运行,这减少了线程上下文切换的开销。
  • 从当代互联网发展趋势来说:现在的系统动不动就要求百万级甚至千万级的并发量,而多线程并发编程正是开发高并发系统的基础。利用好多线程机制可以大大提高系统整体的并发能力以及性能。
  • 从计算机底层再说,在单核时代多线程主要是为了提高CPU和IO设备的综合利用率;多核时代多线程主要为了提高CPU利用率。

线程的状态

线程的生命周期及五种基本状态:

  1. 新疆状态(new):当线程对象创建后,即进入到了新建状态。如:Thread t = new Thread( );

  2. 就绪状态(Runnable):当调用线程对象的start( )方法,线程即进入到了就绪状态,处于就绪状态的线程,只是说明此线程已经做好准备,随时等待CPU调度执行,并不是说执行了t.start( )此线程立即会执行。

  3. 运行状态(Running):当CPU开始调度处于就绪状态的线程时,此时线程才得以真正执行,即进入到运行状态。注意:就绪状态是进入到运行状态的唯一入口,也就是说,线程要先进入到运行状态执行,首先必须处于就绪状态。

  4. 阻塞状态(Blocked):处于运行状态中的线程由于某种原因,暂时放弃对CPU的使用权,停止执行,此时进入阻塞状态,直到其进入就绪状态,才有机会再次被CPU调用以进入到运行状态。根据阻塞产生的原因不同,阻塞状态分为三种:

    1. 等待阻塞:运行状态中的线程执行wait( )方法,使本线程进入到等待阻塞状态;
    2. 同步阻塞:线程在获取synchronized同步锁失败(因为锁被其他资源占用),它会进入同步阻塞状态;
    3. 其他阻塞:通过调用线程的sleep( )或join( )或发出I/O请求时,线程会进入到阻塞状态。当sleep( )状态超时,join( )等待线程终止或者超时,或者I/O处理完毕时,线程重新转入就绪状态。
  5. 死亡状态(Dead):线程执行完了或因为异常退出了run( )方法,该线程结束生命周期。

  开发测试 最新文章
pytest系列——allure之生成测试报告(Wind
某大厂软件测试岗一面笔试题+二面问答题面试
iperf 学习笔记
关于Python中使用selenium八大定位方法
【软件测试】为什么提升不了?8年测试总结再
软件测试复习
PHP笔记-Smarty模板引擎的使用
C++Test使用入门
【Java】单元测试
Net core 3.x 获取客户端地址
上一篇文章      下一篇文章      查看所有文章
加:2021-09-11 00:03:26  更:2021-09-11 00:03:32 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/18 0:12:28-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码