多线程概念初识

Java并发编程的“基石”——多线程概念初识

课程链接:链接

第1章 踏上Java并发征途

1-1 课程概览

  1. 晦涩难懂的概念:

    • 线程、进程
    • 串行、并行、并发
    • 多线程、高并发
    • 同步异步、阻塞非阻塞
  2. 问题

    • 线程和进程有什么不同?
    • 并行和并发有什么区别?
    • 多线程是不是就是高并发?
    • 同步阻塞 和 异步非阻塞 的关系?

1-2 从思维导图看并发脉络

在这里插入图片描述

第2章 孪生兄弟:进程和线程

2-1 什么是进程?实操案例:用活动监视器看正在运行的各进程

  • 操作系统是包含多个进程的容器,而每个进程又都是容纳多个线程的容器

    在这里插入图片描述

  • 进程:是程序(这里可以理解为我们写的代码)的真正运行实例,是资源分配的基本单位。

2-2 什么是线程?实操案例:用代码演示线程数量的实时变化

  • 线程:是CPU的基本调度单位,每个线程执行的都是进程代码的某个片段
/**
 * Date: 2020/3/12 10:43
 * Content: 创建100个进程,用活动监视器的CPU栏目看JAVA线程数量的变化,10秒后线程消失
 */
public class Create100Threads {
    
    
    public static void main(String[] args) {
    
    
        for (int i = 0; i < 100; i++){
    
    
            new Thread(new Runnable() {
    
    
                @Override
                public void run() {
    
    
                    try{
    
    
                        Thread.sleep(5000);
                    } catch (InterruptedException e){
    
    
                        e.printStackTrace();
                    }
                }
            }).start();
        }
    }
}

2-3 线程和进程有哪6个不同?生活用例:房子与住户

  1. 起源不同

    • 先有进程,后有线程(线程的出现目的是提高CPU的利用效率)
  2. 概念不同

    • 进程:是程序(这里可以理解为我们写的代码)的真正运行实例,是资源分配的基本单位。
    • 线程:是CPU的基本调度单位。
  3. 内存共享方式不同

    • 不同进程间的内存通常是不共享的,除非使用进程间通信IPC
    • 两个线程之间通信起来很容易
  4. 拥有的资源不同

    扫描二维码关注公众号,回复: 12570824 查看本文章
    • 线程资源少于进程资源

    • 线程之间共享的内容包括:

      • 1.进程代码段
      • 2.进程的共有数据(利用这些共享的数据,线程很容易实现相互的通讯)
      • 3.进程打开的文件描述符
      • 4.信号的处理器
      • 5.进程的当前目录
      • 6.进程用户ID与进程组ID
    • 线程之间独有的内容包括:

      • 1.线程ID
      • 2.寄存器组的值
      • 3.线程的堆栈
      • 4.错误返回码
      • 5.线程的信号屏蔽码
  5. 数量不同

    • 一个进程可以对应多个线程
  6. 开销不同

    • 线程的创建、终止时间比进程段
    • 同一进程内的线程切换时间比进程之间切换时间短
    • 同一进程内的线程共享内存和文件资源,可以不通过内核进行通信
  • 相似点:生命周期

2-4 Java和多线程的渊源-代码演示JVM自启动线程,分析它们的作用

/**
 * Date: 2020/3/12 11:16
 * Content: 即使代码中不显示创建线程,在运行main时,JVM也会自动启动其他的线程
 */
public class JavaAndThreads {
    
    
    public static void main(String[] args) {
    
    
        System.out.println("Hello Threads!");
    }
}

在这里插入图片描述

  • main 主线程,用户程序的入口
  • Finalizer 负责对象的finalize()方法
  • Reference Handler 和GC、引用相关的线程
  • Signal Dispatcher 把操作系统发来的信号分发给适当的程序

第3章 多线程比线程复杂在哪里?

3-1 什么是多线程?生活案例:”合租室友“和”吃火锅“

  • 多线程:如果一个程序允许运行两个或以上的线程,那么它就是多线程程序。多线程是指单个进程中运行多个线程。

3-2 为什么需要多线程?3大原因

  1. 最主要目的:提高CPU利用率
  • 提高处理速度

  • 避免无效等待(IO的时候可以做别的事)

  • 提高用户体验:避免卡顿、缩短等待时间

    • 并行处理,提高性能,通常是服务器领域(例如Tomcat),用多个线程去接收HTTP请求,而不是排队等待单一的线程处理
    • 在Android开发中,主线程的重要任务之一是绘制屏幕界面,该线程中不允许进行IO操作或者网络请求,目的就是避免卡顿,影响用户的交互
  1. 便于编程建模

  2. 性能定律:摩尔定律失效,阿姆达尔定律上场

3-3 什么场景需要多线程?有哪些局限?

  • 什么场景需要多线程?
    • 为了同时做多件不同的事:(1)开网页同时听音乐(2)后台定时任务
    • 为了提高工作效率、处理能力:(1)tomcat(2)并行下载(3)NIO
    • 需要同时有很大并发量的时候:压测
  • 有哪些局限?
    • 性能问题:上下文切换带来的消耗
    • 异构化任务(任务结构不一样)很难高效并行
    • 带来线程安全问题:包括数据安全问题(例如i++总数不一致)以及线程带来的活跃性问题(线程饥饿、死锁)。

第4章 并行和并发傻傻分不清楚?

4-1并行和并发傻傻分不清楚?一图胜千言

在这里插入图片描述

  • 并行:真正地“同时”运行------在同一个时刻,有多个任务同时执行

    • 例如,在多核处理器上,有两个线程同时执行同一段代码。
    • 可见,单核处理器是无法实现并行的,因为单核处理器无法在同一时刻执行多个任务。
  • 并发:有两种概念:(1)形容多个任务的执行状态(2)对“并发性”的简称

    • (1)形容多个任务的执行状态
      • 两个或多个任务可以在重叠的时间段内启动,运行和完成
      • 并行(两个或多个任务同时执行)一定是并发
    • (2)对“并发性”的简称
      • 不同的部分可以无序或同时执行,且不影响最终的执行结果

4-2 是什么让并发和并行成为了可能?

  • CPU升级
  • 操作系统升级
  • 编程语言升级

第5章 高并发只是并发的升级版吗?

5-1 什么是高并发?企业案例:双11、春晚

  • 高并发:同时有很多请求发送给服务器系统,服务器进行并行处理

5-2 高并发和多线程的关系?相互成就

  • 高并发 是一种 状态,多线程 是一种解决方案

    多线程是我们解决 高并发这个问题 的一种解决方案

  • 高并发 并不意味着是 多线程:Redis

5-3 高并发有哪些重要指标?

  • QPS(Queries Per Second):每秒钟查询数,又是也延伸为每秒钟请求数

  • 带宽

  • PV(Page View):24小时的页面访问(点击)量

  • UV(Unique Visitor):24小时的访问的用户量

    IP和UV的区别:比如断线重连,IP变了,但cookie未变,多个IP对应一个UV;同一局域网中对外只有一个IP,但局域网内不同设备cookie不一样,多个UV对应一个IP

  • 并发连接数(The number of concurrent connections)

  • 服务器平均请求等待时间(Time per request:across all concurrent requests)

第6章 你真的懂同步与异步?阻塞与非阻塞?

6-1 一图胜千言:同步、异步是什么含义?

  • 同步异步是指被调用者(也就是服务器)的行为,而不是请求方的行为。

  • 同步:在没有得到结果之前,服务端就不返回任何结果。

  • 异步:调用发出之后,服务端会立刻返回,告诉调用方“我收到你的请求了,我会处理的”。

    一个例子:最原始的方式烧水,我们需要不停的查看水是否开了—>同步

    ​ 用现在的水壶烧水,直接上电等到水开水壶会响—>异步

在这里插入图片描述

6-2 4中组合:同步阻塞、同步非阻塞、异步阻塞、异步非阻塞

  • 阻塞非阻塞是站在线程状态(线程发出请求(通常是HTTP请求))的角度

  • 阻塞:线程发出请求后只能等待,不能处理其他任何内容

  • 非阻塞:线程发出请求后只能等待,能处理其他内容

堵塞 非堵塞
同步 同步堵塞 同步非堵塞
异步 异步堵塞 异步非堵塞

还是6-1烧水的例子:

同步阻塞:我们需要检查水是否开了(同步),我们只能等待(阻塞)

同步非阻塞:我们需要检查水是否开了(同步),我们可以去做其他事情,比如看电视,每隔三分钟检查一次水是否开了(非阻塞)

异步阻塞:水开之后会提醒我们(异步),我们只能等待(阻塞)

异步非阻塞:水开之后会提醒我们(异步),我们可以去做其他事情(非阻塞)

在这里插入图片描述

第7章 面试问题检验学习成果

7-1 常见面试问题

  1. 进程 和 线程 的相同和不同?
  2. 并行 和 并发 的异同?
  3. 高并发 是不是就意味着 多线程?有什么反例?
  4. 多线程可以提高程序执行效率,你知不知到有哪些弊端?
  5. 什么是同步,什么是异步,什么是阻塞,什么是非阻塞?
  6. 在单核CPU上运行多线程程序有意义吗?

猜你喜欢

转载自blog.csdn.net/weixin_42638946/article/details/113776750