java 多线程基础(二)

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

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

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个线程 能够看到 程序确实实现了线程。java

线程和进程的不一样

  • .进程和线程的定义不一样
    • 进程:是执行中一段程序,即一旦程序被载入到内存中并准备执行,它就是一个进程。进程是表示资源分配的的基本概念,又是调度运行的基本单位,是系统中的并发执行的单位。
    • 线程:单个进程中执行中每一个任务就是一个线程。线程是进程中执行运算的最小单位,是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 主线程,用户程序的入口。

多线程

什么是多线程?

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

生活中的多线程:

比喻你和室友同住一间房web

  • 客厅(进程的内存空间)
  • 厕所(只能有一我的上厕所 上厕所时其余人不能上 锁的概念)
  • 独立房间(每一个线程 有本身的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请求)的角度
  • 阻塞非阻塞的栗子:烧水壶、买书 仍是借书的栗子 若是在你问了老板以后 你若是去干了别的事情那这就是非阻塞。固然若是你一直等着老板 那就是阻塞。 烧开水 一样也是 你能够在烧毁的同时去看电视 等到 水壶发出 呜呜呜的声音你再处理。这样就是异步非阻塞。若是你一直等着 可是等听到水壶发出呜呜呜 的声音 你再去处理 这就是 异步阻塞 所谓的异步就是让被调用者 主动触发 调用者 来实现而同步与此相反 就是水壶不会发出 呜呜呜 的声音你必须时不时的去看 这水壶烧开没有 。
相关文章
相关标签/搜索