JUC(1)

75 阅读2分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第1天,点击查看活动详情

2.1 进程与线程

进程

  • 程序是由指令和程序组成的,指令加载在CPU中,程序加载在内存中,在指令加载过程中还涉及磁盘IO等,
  • 因此进程就是用来加载指令,管理内存,管理IO的

线程

  • 进程分为一个或多个线程,一个称为单线程,多个称为多线程
  • 一个线程就是一个指令流,将指令流中的一条条指令以一定的顺序交给 CPU 执行
  • Java 中,线程作为最小调度单位,进程作为资源分配的最小单位。 在 windows 中进程是不活动的,只是作 为线程的容器

二者对比

  • 进程有共享的内存空间,供其内部的线程共享
  • 不同计算机之间的进程需要通过网络遵守共同的协议比如HTTP
  • 线程是可以共享进程内的内存,比如多个线程可以访问同一个共享变量
  • 线程更轻量,线程上下文切换比进程上下文切换成本低

2.2 并行与并发(concurrent)

并发(concurrent)是同一时间应对(dealing with)多件事情的能力 并行(parallel)是同一时间动手做(doing)多件事情的能力(因为有多个CPU)

2.3 异步调用

  • 需要等待结果返回,才能继续运行就是同步
  • 不需要等待结果返回,就能继续运行就是异步

多线程可以让方法执行变为异步的,比如说读取磁盘文件时,假设读取操作花费了 5 秒钟,如果没有线程调度机制,这 5 秒 cpu 什么都做不了,其它代码都得暂停.

生活中的例子就是煮开水时如果没有脑子,在这段时间内就什么都干不了,只有等开水煮好了才会去干其他事 计算 1 花费 10 ms 计算 2 花费 11 ms 计算 3 花费 9 ms 汇总需要 1 ms

如果使用串行则需要31ms,使用并行则仅仅需要11 + 1 = 12ms

进行磁盘IO时是不用占用CPU的,但是我们拷贝文件时一般是阻塞IO,就相当于给多线程上了个锁,其他线程无法同时进行,也就降低了效率,因此有非阻塞IO和异步IO的提出

关于Java并发的理论知识这里就差不多学完了,下一章让我们来看看具体的实现吧