java 多线程基础(二)

  1. 什么是线程?
    操作系统是包含多个进程的容器,而每个进程又是容纳了多个线程的容器。
    在这里插入图片描述
    从图中可以看出 一个操作系统同时可以有多个子进程,一个进程可以有多个子线程但一个子线程只能有一个父进程。

创建你的第一个java多线程程序:

public class Creat100Threads {

    /**
     * 创建一百个线程
     * @param args
     */
    public static void main(String[] args) throws InterruptedException {
        for(int i=0;i<100;i++){
            new Thread(new Runnable() {
                public void run() {
                    try {
                        Thread.sleep(10000);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
            }).start();
        }
    }
}

在这里插入图片描述
运行代码后 多了100个线程 可以看到 程序确实实现了线程。

线程和进程的不同

  • .进程和线程的定义不同
    • 进程:是执行中一段程序,即一旦程序被载入到内存中并准备执行,它就是一个进程。进程是表示资源分配的的基本概念,又是调度运行的基本单位,是系统中的并发执行的单位。
    • 线程:单个进程中执行中每个任务就是一个线程。线程是进程中执行运算的最小单位,是cpu调度的基本单位。
  • 内存共享方式不同:
    • 进程是相互独立的:不同进程会被操作系统分配一定内存空间,但通常不同进程之间内存是独立的无法互相访问。如果要实现进程间通讯需要用到"进程间通信(IPC)"。
    • 线程之间特定资源是共享的:线程共享资源包括:
    1. 进程代码段
    2. 进程的公有数据(利用这些共享数据,线程很容易实现相互通讯)
    3. 进程打开文件扫描符
    4. 信号处理器
    5. 进程的当前目录
    6. 进程用户ID与进程组ID
    • 线程独有内容:
    1. 线程ID
    2. 寄存器组的值
    3. 线程的堆栈
    4. 错误返回码
    5. 线程的屏蔽新号码
  • 数量不同
    • 一个进程至少有一个或以上线程, 一个线程只能有一个父进程。
  • 开销不同
    1. 线程的创建、终止时间比进程段
    2. 同一进程内的线程切换时间比进程短
    3. 同 一进程的各个线程间共享内存和文件资源,可不通过内核进行通信。

Java语言和多线程的渊源和关系

  • Java设计之初–支持多线程(受限于硬件当时很多语言并不支持多线程)
  • Java语言在服务端开发语言中的地位–常年居榜前三(阿里 腾讯 百度 美团。。。)
  • 一对一映射到操作系统的内核线程(java中的多线程会在操作系统内核 中一一对应建立多线程)
  • jvm自动启动线程
    在这里插入图片描述
    启动一个只有main方法的java程序可以看到除了main线程还jvm还帮我们启动了其他线程,这里面启动的线程有
    Finalizer:负责对象的Finalizer()方法
    Signal Dispatcher 负责把操作系统发来的信号分发给适当的程序处理
    Reference Handler GC、引用相关线程(java的垃圾回收)
    main 主线程,用户程序的入口。

多线程

什么是多线程?

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

生活中的多线程:

比喻你和室友同住一间房

  • 客厅(进程的内存空间)
  • 厕所(只能有一个人上厕所 上厕所时其他人不能上 锁的概念)
  • 独立房间(每个线程 有自己的ID 堆栈)
  • 打扫(一个人打扫效率比较慢 在公共区域可能会一起协作打扫 )
  • 吃火锅
    • 大火锅一人吃(相当于 单进程单线程)
    • 大火锅一起吃 (单进程 多线程)
    • 一个人吃多个小火锅(多进程)
    • 吃火锅底料(有人霸占了这些火锅(锁) 那你就吃不到了)

什么是多线程?

多线程实际例子:抢火车票
在这里插入图片描述
如果各个任务相互独立 互不影响 则不需要多线程。
在这里插入图片描述
但绝大多数场景不同的任务 是相互耦合影响的,这时候就需要多线程。

为什么需要多线程?

  • 最主要是提高cpu利用效率
    -cpu一个时钟周期 是非常快的 相对于内存 和 硬盘来说 是跟不上 cpu这个速度的 如果 为了响应 cpu 内存 的处理的数据 那会大大拖累cpu的性能。那cpu在这个等到内存 等外部设备处理的、过程中就会浪费资源。而多线程就是提高cpu的资源利用率。
  • 提高用户体验:避免卡顿、缩短等待时间
    • 并行处理,提高性能,通常是服务领域(例如timcat),用多个线程去接收进来的Http请求,而不是排队等待单一的线程处理。
    • 在Android开发中,主线程的重要任务之一是绘制屏幕界面,该线程中不允许进行IO操作或网络请求,目的是避免卡顿,影响用户交互。
  • 便于程序员设计编程模型(将一个功能分割成若干不同子线程)
  • 阿姆达定律
    -处理器越多,程序就执行越快,但有上限,取决于程序中串行部分的比例,并行比例越高多处理器性能优势越明显。
    在这里插入图片描述
    由于摩尔定律的逐渐失效 单主频提升越来越不明显,要想提升程序速度 需要靠程序提高并行处理的能力。

什么场景会用到多线程?

  • 同时处理不同的事:1. 听音乐 2. 后台定时任务,execel
  • 同时提高工作效率:1. tomecat 2. 并行下载 3. NIO
  • 需要很大并发量的时候

多线程的局限

  • 性能问题:上下文切换带来的问题
  • 异构化任务: (任务结构不一样)很难高效并行
  • 带来线程安全问题:包括数据安全问题(例如i++ 总数不一致) 以及线程带来的活跃性问题(线程饥饿、死锁)

串行、并行、并发

  • 串行和并行
    在这里插入图片描述
    打个比方 串行就是你数羊毛一次数1根1根的 而并行 是十根十根一起数。
  • 并行、并发
    在这里插入图片描述
    在只有一个cpu的情况下 但是 你的音乐 QQ 都能 同时运行 互相切换 就是cpu处于并行运算 将cpu的片段是在不同进程中切换分配的。这时cpu相当于在逻辑上并行处理多个应用。
    而当有多个cpu时 程序跑在真实的不同物理cpu上这时就是并发了。
    在这里插入图片描述
  • 真正的"同时"运行-在同一时刻,有多个任务同时执行。
    例如,在多核处理器上,有两个线程同时执行一段代码。
    相反的,单核cpu是无法处理并发任务的。

并发的2种概念

  1. 形容多个任务的执行状态
    • 两个或多个任务可以再重叠的时间段内启动,运行和完成
    • 并发(两个线程同时执行)一定是并发
      p a r a l l e l i s m C o n c u r r e n c y parallelism \in Concurrency
      可以说:并发是并行的充分条件,并行是并发的必要条件。
      在这里插入图片描述
  2. 对"并发性"的简称
    • 不同部分可以无序或同时执行,且并不会影响最终的执行结果。
    • 在不同核心数的计算机上的不同表现

串并行和并发的实际例子

  • 打游戏时,女朋友来电话
    假设 大脑是单核cpu
    并行:此时 如果你选择继续打游戏并且 接电话 但受限于你的大脑是单核的 你的思维就只能在这之间不同切换,此时就是并行。
    串行:此时你选择暂时不接电话,等游戏结束后 再打电话给女朋友 ,此时就是串行,每次只处理一件事。
    一个程序能并行运行一定具有并发性。

是什么让并发和并行成为可能?

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

高并发

  • 什么是高并发(双十一 春晚 12306)
    • 是系统 同时能够处理大量的不求请求的能力。
  • 高并发和多线程的联系和不同?
    • 多线程是高并发的一种重要的解决方案,多线程并不意味着高并发,如Redis 是单线程的同时也是能处理大量的请求。
  • 高并发有哪些指标
    -QPS(Queries Per Second) 每秒的查询数
    • 带宽
    • PV(Page View)
    • UV(Unique Visitor)
    • IP 和 UV 的区别
    • 并发连接数(The number of concurrency)
    • 服务器平均请求等待时间 (Time per request:across all concurrent requests)

同步与异步、阻塞与非阻塞

  • 同步与异步:被调用者主动告诉调用者结果
  • 阻塞与非阻塞:我是调用者,我调用一个东西以后,结果返回前,是否还能处理其他事情。

在这里插入图片描述
如上图 在EVENT调用后 有一段等待时间 电脑是不会做其他事情的 直到结果返回前,此时电脑资源被白白的耗费着。

在这里插入图片描述
异步就不同了在发送一个请求后在服务器响应前 电脑又去处理其他请求了。 就相当于你烧白开水 同步的话你就守在水壶面前什么也不干 直到水壶烧开 开关跳掉 但我相信平时你坑定不会这么做 更多的是异步 烧开水时你去干别的事等 烧开 等电源跳掉 你听到了 再去取。
在这里插入图片描述

同步:同步异步这里指的是被调用者(也就是服务器)的行为,而不是请求方的行为。在没有得到结果这钱,服务端就不返回任何结果。
异步:调用在发出之后,服务端立刻返回,告诉调用方”我收到你的请求了,我会处理的“。
再打个比方 你去借书 问老板有没有这本书老板说 我帮你找找 然后过了一小时你就去问老板 书有没有找到 这时同步的一种思想 与此相对的是 当你去问老板的时候老板说 我先帮你找找 你留个电话找到了我再打电话给你这就相当于异步 回调了你的电话。

阻塞和非阻塞

  • 站在线程状态的角度
  • 站在线程发出请求(通常是HTTP请求)的角度
  • 阻塞非阻塞的栗子:烧水壶、买书
    还是借书的栗子 如果在你问了老板之后 你如果去干了别的事情那这就是非阻塞。当然如果你一直等着老板 那就是阻塞。
    烧开水 同样也是 你可以在烧毁的同时去看电视 等到 水壶发出 呜呜呜的声音你再处理。这样就是异步非阻塞。如果你一直等着 但是等听到水壶发出呜呜呜 的声音 你再去处理 这就是 异步阻塞 所谓的异步就是让被调用者 主动触发 调用者 来实现而同步与此相反 就是水壶不会发出 呜呜呜 的声音你必须时不时的去看 这水壶烧开没有 。
发布了67 篇原创文章 · 获赞 5 · 访问量 3191

猜你喜欢

转载自blog.csdn.net/weixin_41315492/article/details/103024817
今日推荐