根底概念
线程 & 过程
并发 & 并行
- 线程 & 过程
官网个别是这样定义的:线程(thread)是操作系统可能进行运算调度的最小单位,它被蕴含在过程之中,是过程中的理论运作单位。
说人话,间接上图. 咱们关上电脑管家就是一个 ** 过程 **。而点击杀毒性能运行就是开启了一个 ** 线程 **。不用繁琐,要害明确一个过程可能蕴含多个线程即可。
- 并发 & 并行
Erlang 之父 Joe Armstrong 用一张 5 岁小孩都能看懂的图解释了并发与并行的区别
艰深来讲,对于计算机而言,就是判断多个线程是否在同时抢夺一块 CPU 资源。如果是,则 并发 。如果不是,则 并行 。理解这些基本概念后,当多个线程同时竞争一块资源时。咱们提出一个新的概念叫 高并发。也即秒杀、限量抢购等是用同一个情理
背景引例
如果多个小黄人同时抢 10 只香蕉,(这里用 Bob, Dave, Stuart 代表多个)。这个过程其实就是高并发。
咱们将香蕉作为 资源类 ,每一个小黄人称为一个 线程 ,抢香蕉的过程称为 线程操作资源类。用一段简略的 java 小程序模仿实现这个过程。
代码实操
- 定义一个资源类 Banana(香蕉)
class Banana {
private int number = 10; // 现有香蕉一只
Lock lock = new ReentrantLock(); // 锁
public void stolen() { // 被抢走
lock.lock();
try {if (number > 0) {System.out.println(Thread.currentThread().getName()
+ "t 抢到【" + (number--) + "】残余:【" +
number + "】只香蕉!");
}
} catch (Exception e) {e.printStackTrace();
} finally {lock.unlock();
}
}
}
2 . 线程操作资源类 Main(抢香蕉过程)
public class Main {public static void main(String[] args) {Banana banana = new Banana();
//Lamabada 表达式开启三个线程
new Thread(()->{ for (int i = 0; i < 15; i++) {banana.stolen();
}},"Bob").start();)new Thread(()->{ for (int i = 0; i < 15; i++) {banana.stolen();
}},"Dave").start();
new Thread(()->{ for (int i = 0; i < 15; i++) {banana.stolen();
}},"Stuart").start();}
}
运行成果
再次运行
多运行几次
运行后果截然不同。由此可见,线程的调度是随机的。
小结
- 理解线程、过程、并发的概念
- 理解线程调度的随机性
- 学习 Lamada 表达式的利用
- 引出并发场景下 JUC 的利用
【END】
有道无术,术可求。有术无道,止于术。