【Java】JUC-引例(小黄人抢香蕉引发的思考)

基础概念
线程&进程
并发&并行

  • 线程&进程

官方一般是这样定义的:线程(thread)是操作系统能够进行运算调度的最小单位,它被包含在进程之中,是进程中的实际运作单位。

说人话,直接上图.我们打开电脑管家就是一个**进程**。而点击杀毒功能运行就是开启了一个**线程**。不必繁琐,关键明白一个进程可能包含多个线程即可。

【Java】JUC-引例(小黄人抢香蕉引发的思考)

  • 并发&并行

Erlang 之父 Joe Armspan 用一张5岁小孩都能看懂的图解释了并发与并行的区别

【Java】JUC-引例(小黄人抢香蕉引发的思考)

通俗来讲,对于计算机而言,就是判断多个线程是否在同时争夺一块CPU资源。如果是,则并发。如果不是,则并行。了解这些基本概念后,当多个线程同时竞争一块资源时。我们提出一个新的概念叫高并发。也即秒杀、限量抢购等是用同一个道理

背景引例

假如多个小黄人同时抢10只香蕉,(这里用Bob, Dave, Stuart代表多个)。这个过程其实就是高并发。

【Java】JUC-引例(小黄人抢香蕉引发的思考)

我们将香蕉作为资源类,每一个小黄人称为一个线程,抢香蕉的过程称为线程操作资源类。用一段简单的java小程序模拟实现这个过程。

代码实操

  1. 定义一个资源类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();

}

}

运行效果

【Java】JUC-引例(小黄人抢香蕉引发的思考)

再次运行

【Java】JUC-引例(小黄人抢香蕉引发的思考)

多运行几次

【Java】JUC-引例(小黄人抢香蕉引发的思考)

运行结果截然不同。由此可见,线程的调度是随机的。

小结

  1. 了解线程、进程、并发的概念
  2. 了解线程调度的随机性
  3. 学习Lamada表达式的应用
  4. 引出并发场景下JUC的应用

【END】
有道无术,书可求。有术无道,止于术。
【Java】JUC-引例(小黄人抢香蕉引发的思考)

以上是 【Java】JUC-引例(小黄人抢香蕉引发的思考) 的全部内容, 来源链接: utcz.com/a/100380.html

回到顶部