那些年搞不懂的多线程同步异步及阻塞和非阻塞---多线程简介

leskang leskang     2022-09-14     743

关键词:

1、进程和线程的概念

进程:运行中的应用程序称为进程,拥有系统资源(cpu、内存)

线程:进程中的一段代码,一个进程中可以有多段代码。本身不拥有资源(共享所在进程的资源);

在java中,程序入口被自动创建为主线程,在主线程中可以创建多个子线程。

区别:

 1、是否占有资源问题

 2、创建或撤销一个进程所需要的开销比创建或撤销一个线程所需要的开销大。

 3、进程为重量级组件,线程为轻量级组件

 

多进程: 在操作系统中能同时运行多个任务(程序)

多线程: 在同一应用程序中有多个功能流同时执行

 

已经有了进程,为什么还会需要线程呢?主要原因如下:

  1. 许多应用程序中,同时发生着多个活动。将这些应用程序分解成多个准并行的线程,程序设计的模型会变成更加简单。
  2. 由于线程比进程进行更加轻量,创建和取消更加容易。
  3. 如果程序是IO密集型,那么多线程执行能够加快程序的执行速度。(如果是CPU密集型,则没有这个优势)
  4. 在多CPU系统中,多线程是可以真正并行执行的。

 

2、线程的主要特点

①、不能以一个文件名的方式独立存在在磁盘中;

②、不能单独执行,只有在进程启动后才可启动;

③、线程可以共享进程相同的内存(代码与数据)。

 

3、多线程原理

同一时间,CPU只能处理1条线程,只有1条线程在工作(执行)
多线程并发(同时)执行,其实是CPU快速地在多条线程之间调度(切换)
如果CPU调度线程的时间足够快,就造成了多线程并发执行的假象

思考:如果线程非常非常多,会发生什么情况?

CPU会在N多线程之间调度,CPU会累死,消耗大量的CPU资源

每条线程被调度执行的频次会降低(线程的执行效率降低)

 

4、线程的主要用途

①、利用它可以完成重复性的工作(如实现动画、声音等的播放)。

②、从事一次性较费时的初始化工作(如网络连接、声音数据文件的加载)。

③、并发执行的运行效果(一个进程多个线程)以实现更复杂的功能

 

5、多线程(多个线程同时运行)程序的优缺点

优点:

①、可以减轻系统性能方面的瓶颈,因为可以并行操作;

②、提高CPU的处理器的效率,在多线程中,通过优先级管理,可以使重要的程序优先操作,提高了任务管理的灵活性;

另一方面,在多CPU系统中,可以把不同的线程在不同的CPU中执行,真正做到同时处理多任务。

缺点:

1、开启线程需要占用一定的内存空间(默认情况下,主线程占用1M,子线程占用512KB),如果开启大量的线程,会占用大量的内存空间,降低程序的性能

2、线程越多,CPU在调度线程上的开销就越大

3、程序设计更加复杂:比如线程之间的通信、多线程的数据共享

 

6、多线程的生命周期

线程状态:

与人有生老病死一样,线程也同样要经历新建、就绪、运行(活动)、阻塞和死亡五种不同的状态。这五种状态都可以通过Thread类中的方法进行控制。

 

创建并运行线程:

① 新建状态(New Thread):在Java语言中使用new 操作符创建一个线程后,该线程仅仅是一个空对象,它具备类线程的一些特征,但此时系统没有为其分配资源,这时的线程处于创建状态。

线程处于创建状态时,可通过Thread类的方法来设置各种属性,如线程的优先级(setPriority)、线程名(setName)和线程的类型(setDaemon)等。

② 就绪状态(Runnable):使用start()方法启动一个线程后,系统为该线程分配了除CPU外的所需资源,使该线程处于就绪状态。此外,如果某个线程执行了yield()方法,那么该线程会被暂时剥夺CPU资源,重新进入就绪状态。

③ 运行状态(Running):Java运行系统通过调度选中一个处于就绪状态的线程,使其占有CPU并转为运行状态。此时,系统真正执行线程的run()方法。

a)     可以通过Thread类的isAlive方法来判断线程是否处于就绪/运行状态:当线程处于就绪/运行状态时,isAlive返回true,当isAlive返回false时,可能线程处于阻塞状态,也可能处于停止状态。

④ 阻塞和唤醒线程

阻塞状态(Blocked):一个正在运行的线程因某些原因不能继续运行时,就进入阻塞 状态。这些原因包括:

  • 等待阻塞:当线程执行了某个对象的wait()方法时,线程会被置入该对象的等待集中,直到执行了该对象的notify()方法wait()/notify()方法的执行要求线程首先获得该对象的锁。
  • 同步阻塞:当多个线程试图进入某个同步区域(同步锁)时,没能进入该同步区域(同步锁)的线程会被置入锁定集(锁池)中,直到获得该同步区域的锁,进入就绪状态。
  • 其他阻塞:运行的线程执行sleep()或join()方法,或者发出了I/O请求时,JVM会把该线程置为阻塞状态。当sleep()状态超时、join()等待线程终止或者超时、或者I/O处理完毕时,线程重新转入就绪状态。

⑤ 死亡状态(Dead):线程在run()方法执行结束后进入死亡状态。此外,如果线程执行了interrupt()或stop()方法,那么它也会以异常退出的方式进入死亡状态。

 

7、终止线程的三种方法

① 使用退出标志,使线程正常退出,也就是当run方法完成后线程终止,推荐使用。

② 使用stop方法强制终止线程(这个方法不推荐使用,因为stop和suppend、resume一样,也可能发生不可预料的结果)。

③ 使用interrupt方法中断线程。

 

那些年搞不懂的术语概念:协变逆变不变体

简述什么是协变性、逆变性、不变性协变性,如:string->object(子类到父类的转换)逆变性,如:object->string(父类到子类的转换)不变性,基于上面两种情况,不可变。具体下面再做分析。泛型委托的可变性先使用框架定... 查看详情

那些年搞不懂的"协变"和"逆变"

  博主之前也不是很清楚协变与逆变,今天在书上看到了有关于协变还是逆变的介绍感觉还是不太懂,后来看了一篇园子里面一位朋友的文章,顿时茅塞顿开。本文里面会有自己的一些见解也会引用博友的一些正文,希望通过本篇,... 查看详情

深入理解非阻塞同步io和非阻塞异步io

...;很多人对阻塞/非阻塞,同步/异步的概念理解的不深入,搞不清楚非阻塞和异步IO的区别,笼统的认为非阻塞IO就是异 查看详情

同步和异步阻塞和非阻塞线程进程和协程异同的理解

最近打算使用python做接口压测,选择实现方式时,学习的一些概念在这里做下记录1.同步与异步同步和异步关注的是消息通信机制(synchronouscommunication/asynchronouscommunication)所谓同步,就是在发出一个*调用*时,在没有得到结果之前... 查看详情

阻塞非阻塞同步异步

...的是程序等待调用结果的状态。阻塞调用返回之前,当前线程挂起。调用线程只有等待结果之后才返回。非阻塞它不会阻塞当前线程。 查看详情

同步异步阻塞和非阻塞

同步、异步、阻塞和非阻塞---待续同步、异步:是在消息通知机制的角度来说,同步需时刻关注下一个依赖任务的结果,异步是通知下一个依赖任务开始工作。就像给一个人分配一件任务,同步需等待他把这件事情干完,异步是... 查看详情

谈io中的阻塞和非阻塞,同步和异步及三种io模型

什么是同步和异步?    烧水,我们都是通过热水壶来烧水的。在很久之前,科技还没有这么发达的时候,如果我们要烧水,需要把水壶放到火炉上,我们通过观察水壶内的水的沸腾程度来判断水有没有烧开。随着... 查看详情

同步和异步以及阻塞和非阻塞

...阻塞:概念:程序等待调用结果时的状态解释:涉及到CPU线程调度;所谓阻塞,就是调用结果返回之前,该执行线程会被挂起,不释放CPU执行权,线程不能做其它事情,只能等待,只有等到调用结果返回了,才能接着往下执行;... 查看详情

同步异步阻塞非阻塞概念区分

...开水。提前剧透一下:同步和非同步主要用来形容被调用线程,阻塞非阻塞用来形容主线程的。出场人物:老张(主线程),水壶(被调用线程)两把(普通水壶,简称水壶;会响的水壶,简称响水壶)。 1老张把水壶放到... 查看详情

同步异步阻塞和非阻塞(代码片段)

以前对同步、异步、阻塞和非阻塞的概念没有清晰的认识,错误地认为:同步=阻塞,异步=非阻塞。因此,在这里,对同步、异步、阻塞和非阻塞重新学习参考链接:聊聊同步、异步、阻塞与非阻塞什么是同步,什么是异步?首先... 查看详情

多线程——同步-异步-阻塞-非阻塞

...呵,好久没写博客了,今天让我们来回顾一下多线程的一些基础知识。一、同步和异步1、同步(synchronous)    所谓同步,就是在让请求别人做一件事情时,在没有得到最终结果之前,就需要耐心... 查看详情

同步异步阻塞和非阻塞之间的区别

同步和异步,阻塞和非阻塞是大家经常会听到的概念,但是它们是从不同维度来描述一件事情,常常很容易混为一谈。1.同步和异步同步和异步描述的是消息通信的机制。同步当一个request发送出去以后,会得到一个response,这整... 查看详情

阻塞非阻塞同步异步

1、阻塞与非阻塞阻塞与非阻塞是对同一个线程来说的,在某个时刻,线程要么处于阻塞,要么处于非阻塞。阻塞和非阻塞关注的是程序在等待调用结果(消息,返回值)时的状态。阻塞调用是指调用结果返回之前,当前线程会... 查看详情

异步/同步,阻塞/非阻塞,单线程/多线程概念梳理(代码片段)

最近看了一文说到异步是单线程的,顿时就傻眼了,对相关概念和同事进行了一些讨论和总结.文中的描述是以我的理解来说的,可能不一定准确甚至正确,有错欢迎指正.这三个概念我认为是描述不同的维度的,概念正交.异步同步异步... 查看详情

异步/同步/阻塞/非阻塞

...之后再继续后面的工作 阻塞:调用结果返回之前,当前线程会被挂起,一直处于等待消息通知,不能够执行其他业务,等待当前函数返回非阻塞:不能立刻得到结果之前,该函数不会阻塞当前线程,而会立刻返回 总结:同步和异步的... 查看详情

阻塞和非阻塞,同步和异步

阻塞和非阻塞,同步和异步1例子故事:老王烧开水。出场人物:老张,水壶两把(普通水壶,简称水壶;会响的水壶,简称响水壶)。老王想了想,有好几种等待方式1.老王用水壶煮水,并且站在那里,不管水开没开,每隔一定... 查看详情

关于同步异步阻塞和非阻塞多路复用(io系列一)(代码片段)

关于同步、异步、阻塞和非阻塞、多路复用一、背景网站的资料非常多,各种说法都有,我这个资料是总结于比较权威的机构的视频,并非从网上其他地方粘贴过来的,有自己的思考和理解。我也是这么学习和摸... 查看详情

io概念解析------同步异步阻塞非阻塞

...的状态.  阻塞调用是指调用结果返回之前,当前线程会被挂起。调用线程只有在得到结果之后才会返回。非阻塞调用指在不能立刻得到结果之前,该调用不会阻塞当前线程。 对于同步调用来说,很多时候当前线程还... 查看详情