趣味故事掌握多线程基础 - 揭秘大型鞋厂百万并发产能内幕【视频+多图建议收藏】(1)

最后

整理的这些资料希望对Java开发的朋友们有所参考以及少走弯路,本文的重点是你有没有收获与成长,其余的都不重要,希望读者们能谨记这一点。

image

image

其实面试这一块早在第一个说的25大面试专题就全都有的。以上提及的这些全部的面试+学习的各种笔记资料,我这差不多来回搞了三个多月,收集整理真的很不容易,其中还有很多自己的一些知识总结。正是因为很麻烦,所以对以上这些学习复习资料感兴趣,

本文已被CODING开源项目:【一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码】收录

需要这份系统化的资料的朋友,可以点击这里获取

哇,小白问出这个问题很有创造性!

哇,雷学委认为多线程这一块很重要啊,很多小白写很多代码,总停留在CRUD或写方法倒腾数据,根本提升不了!

这里学委准备了一个短视频:

《雷学委趣味编程故事汇编》系列之多线程基础

下面学委继续鞋厂流水线进行讲解。
在这里插入图片描述

来,我们一起又看看,大型鞋厂生产线

下图是生产线一个打包环节的工人们,可爱的妹子们在认真的包装鞋子制品(多么灿烂的笑容啊!)
在这里插入图片描述
图片来自,中国皮革人才网@东莞鞋厂将在贵州建12条生产线,解决2400余人就业

小白,你看这个车间是不是很多人,很多鞋子。

如果生产一万双鞋子,一百个员工,一人分配一百双鞋子,八小时工作制,那么每个小时不就是12.5双鞋子,还可以吧

10000 / 100 / 8 = 12.5

不过月销百万双鞋子,按照22天工作,那么每个小时处理的鞋子数量得达到56.8,也就是一分钟一双鞋!

1000000/ 22 / 100 / 8 = 56.8

不过,实际情况,很可能工厂同样的量聘请的工人没有这里说的100那么多,但处理的量和工作时长更长,挺辛苦的!

可以看看下面的视频,一直都挺忙碌!
在这里插入图片描述
图片截图自视频:实拍鞋厂里的生产流水线,原来是这样制作的,真是让我开眼界了!

小白此刻并没有很高兴,看着有点心疼工人朋友们。但他是清醒的,他认为得继续学习,抱怨没用的不如提升自己,以后发挥更多正向作用!

他继续问:那这些生活流水线,交给程序自动化不就好了吗,程序怎么做的?我想学!

好的,那请耐心认真学习。

什么是线程(Thread),不是现成!

直观来理解,每一个劳碌工作的工人就像一个线程,然后3.3万双鞋子就是每天的工作量。连续运行21天,就能生产接近100万双鞋子。(后面会把这个代码实现了!小白务必收藏多运行,掌握,这是成为中高级程序员必须迈过的坎)

线程可以理解成是在Java进程中独立运行的子任务。
进程是一个具有一定独立功能的程序关于某个数据集合的一次运行活动。
它是操作系统动态执行的基本单元,在传统的操作系统中,进程既是基本的分配单元,也是基本的执行单元。

下面是Java中一个线程的实现:

package org.levintech.javademo.leixuewei.multithread;

import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.LinkedBlockingQueue;

/\*\*
 \* 一个简单打工人线程
 \*
 \* @author levin
 \* Created on 2021/7/10
 \* [雷学委] CSDN/Juejin Code Demo
 \*/
public class SimpleWorker extends Thread {
    private String workerName;
    private Integer batchSize;

    public SimpleWorker(String workerName, Integer batchSize) {
        this.workerName = workerName;
        this.batchSize = batchSize;
    }

    @Override
    public String toString() {
        return "SimpleWorker{" +
                "workerName='" + workerName +
                ",batchSize='" + batchSize +
                '}';
    }

    @Override//重写run方法,进行线程业务处理
    public void run() {
        System.out.println("【雷学委代码Demo】工人" + toString());
    }

    public String getWorkerName() {
        return workerName;
    }

    public Integer getBatchSize() {
        return batchSize;
    }
}

定义线程有好几种方式,本文只重点展示一种!其他懂的可以评论区留言,验证一下你的知识,哈哈。

在这里插入图片描述

运行项目中的LeiXueWeiRunner,可以查看如下运行效果:
在这里插入图片描述
小白说我这里看有一个state,是状态吗?

没错,线程跟工人一样也是有状态,也会朝气蓬勃,也会精疲力竭的。

线程的状态总共6中的,具体如下图:
在这里插入图片描述
小白说:那是不是new创建Thread或者继承类,就是新建状态(NEW);接着调用了start之后线程就是运行状态(RUNNABLE),然后没别的事情就顺利结束(TERMINATED)?

雷学委:是的,没错。至于线程等待别的线程(比如调用了join方法)就转变为等待状态(WAITING或TIMED_WAITING)。如果线程执行过程需要获取一个锁定的资源,那么就是阻塞状态(BLOCKED)

小白好像对阻塞状态不太懂?

打个比方,假设你家里只有一串钥匙,几个柜子都用这串钥匙来开,但此时你妹妹在用它来打开A柜子,那你是不是没发去打开B柜子了?只能等她开完把钥匙给你开锁。如果她拿完东西,跑出去玩了,哈哈哈,那结果就你这线程一直等待!!!

嗯,明白了。(小白用力的点头)

官方给的线程状态介绍在这里: https://docs.oracle.com/javase/8/docs/api/java/lang/Thread.State.html

不错,你已经掌握了多线程基础,已经学会如何创建线程知道线程的状态,到这里可以三连了!

下面直接看百万订单是如何被处理的?

下面学委写了一个新的类(继承了普通工人),其实吧,“高级”打工人也还是打工人,大家都是一样的,应该共同致力搞好工作氛围!

小白你准备好了吗?雷学委要直接上最难代码了。(小白估计只能懂个故事了,代码他估计下次还会来问!)

小白信心满满,上面的那么简单,接下来估计不会难到哪去吧。

下面是高级打工人的代码实现,在看代码后面解析之前,请自己想想为什么要这样写?

/\*\*
 \* 一个"高级"打工人线程
 \*
 \* @author levin
 \* Created on 2021/7/10
 \* [雷学委] CSDN/Juejin Code Demo
 \*/
public class Worker extends SimpleWorker {
    private LinkedBlockingQueue<Integer> workItems;
    private ConcurrentHashMap<String, List<Integer>> status;

    public Worker(String workerName, Integer batchSize, LinkedBlockingQueue<Integer> workItems, ConcurrentHashMap<String, List<Integer>> status) {
        super(workerName, batchSize);
        this.workItems = workItems;
        this.status = status;
    }

    @Override
    public String toString() {
        return "Worker{" +
                "workerName='" + super.getWorkerName() +
                ",batchSize='" + super.getBatchSize() +
                ",thread=" + super.getName() +
                ",threadId=" + super.getId() +
                ",threadPriority=" + super.getPriority() +
                ",threadState=" + super.getState() +


# 完结

Redis**基于内存**,常用作于**缓存**的一种技术,并且Redis存储的方式是以key-value的形式。Redis是如今互联网技术架构中,使用最广泛的缓存,在工作中常常会使用到。Redis也是中高级后端工程师技术面试中,面试官最喜欢问的问题之一,因此作为Java开发者,Redis是我们必须要掌握的。

Redis 是 NoSQL 数据库领域的佼佼者,如果你需要了解 Redis 是如何实现高并发、海量数据存储的,那么这份腾讯专家手敲《Redis源码日志笔记》将会是你的最佳选择。

![](https://img-blog.csdnimg.cn/img_convert/ad2dcab0d2215ebca17d04396b96d338.webp?x-oss-process=image/format,png)

> **本文已被[CODING开源项目:【一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码】](https://bbs.csdn.net/forums/4f45ff00ff254613a03fab5e56a57acb)收录**

**[需要这份系统化的资料的朋友,可以点击这里获取](https://bbs.csdn.net/forums/4f45ff00ff254613a03fab5e56a57acb)**

..(img-TtBJq5ho-1715707788390)]

> **本文已被[CODING开源项目:【一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码】](https://bbs.csdn.net/forums/4f45ff00ff254613a03fab5e56a57acb)收录**

**[需要这份系统化的资料的朋友,可以点击这里获取](https://bbs.csdn.net/forums/4f45ff00ff254613a03fab5e56a57acb)**

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值