当前位置: 首页 > news >正文

小白学多线程(持续更新中)

1.线程池技术

1.JDK中的线程池

JDK中创建线程池有一个最全的构造方法,里面七个参数如上所示。

执行流程分析:

模拟条件:10个核心线程数,200个最大线程数,阻塞队列大小为100。

  • 当有小于十个任务要处理时,因为小于核心线程数,所以直接有对应的核心线程处理
  • 当有11个任务,前十个由核心线程处理,第11个进入等待/阻塞队列中,如果核心线程完成任务,则核心线程再处理
  • 当有111个任务,前10个由核心线程处理,后续100个进入等待/阻塞队列中,最后一个需要创建救急线程,第三四个参数设定了救急线程的生产时间和单位,意思是救急线程完成任务后,需要多久才会释放这个救急线程
  • 当有201个任务,因为任务数量大于了最大线程,所以在执行第201个任务时,会执行拒绝策略

2.Tomcat中的线程池

注意,Tomcat中的线程池和JDK的线程池有所不同。如果执行的请求数大于核心线程数并且小于最大线程数,会直接创建新的线程,达到最大线程数后,才会在等待队列中。如果等待队列满了,才会报异常。

模拟条件:10个核心线程数,200个最大线程数,阻塞队列大小为100。

  • 当有小于十个任务要处理时,因为小于核心线程数,所以直接有对应的核心线程处理
  • 当有11个任务,前十个由核心线程处理,第11个因为小于最大线程数,所以直接创建新的线程
  • 当有201个任务,前10个由核心线程处理,后续190个是创建新的线程来处理,第201个会进入阻塞队列
  • 当有301个任务,执行第301个任务时因为超出了最大线程数,并且阻塞队列也满了,这时会抛出异常

springboot中配置tomcat线程池相关参数为:

server:tomcat:threads:max: 200min - spare: 10accept - count: 100

其中:max为最大线程数,min-spare为最小空余线程数,也可以理解为核心线程数,accept-account为阻塞队列数

2.创建线程的几种方式

1.创建Thread子类

// 构造方法的参数是给线程指定名字,推荐
Thread t1 = new Thread("t1") {@Override// run 方法内实现了要执行的任务public void run() {log.debug("hello");}
};
t1.start();

2.创建Runnable实现类配合Thread

// 创建任务对象
Runnable task2 = new Runnable() {@Overridepublic void run() {log.debug("hello");}
};
​
// 参数1 是任务对象; 参数2 是线程名字,推荐
Thread t2 = new Thread(task2, "t2");
t2.start();
注意:以上可以使用lambda简化。
// 创建任务对象
Runnable task2 = () -> log.debug("hello");
​
// 参数1 是任务对象; 参数2 是线程名字,推荐
Thread t2 = new Thread(task2, "t2");
t2.start();

原理之Thread与Runnable的关系

private Runnable target;
​
@Override
public void run() {if (target != null) {target.run();}
}

小结:

  • 方法1 是把线程和任务合并在了一起,方法2 是把线程和任务分开了

  • 用 Runnable 更容易与线程池等高级 API 配合

  • 用 Runnable 让任务类脱离了 Thread 继承体系,更灵活

3.FutureTask配合Thread

FutureTask 能够接收 Callable 类型的参数,用来处理有返回结果的情况

// 创建任务对象
FutureTask<Integer> task3 = new FutureTask<>(() -> {log.debug("hello");return 100;
});
​
// 参数1 是任务对象; 参数2 是线程名字,推荐
new Thread(task3, "t3").start();
​
// 主线程阻塞,同步等待 task 执行完毕的结果
Integer result = task3.get();
log.debug("结果是:{}", result);

4.使用线程池

就是以上讲的创建线程池,然后在池中取线程。

3.synchronized使用及原理(阻塞式)

为什么会出现synchronized呢?

4.Lock使用及原理(阻塞式)

5.原子变量(非阻塞式)


http://www.mrgr.cn/news/77920.html

相关文章:

  • aws配置飞书告警通知
  • 面试经典 150 题:205,55
  • 时序预测 | Matlab实现PSO-Elman粒子群优化递归神经网络时间序列预测
  • RK356x-10:串口(uart)配置与调试
  • vue3(十九)-基础入门之vue-nuxt反向代理
  • 常见LLM大模型概览与详解
  • 数据结构 (5)栈
  • TCP socket api详解
  • Android 常用命令和工具解析之GPU相关
  • 数字信号处理(Digital Signal Procession)总结
  • 从搭建uni-app+vue3工程开始
  • Linux高阶——1117—TCP客户端服务端
  • HarmonyOS:使用ArkWeb构建页面
  • 工具学习_Docker
  • 用Tauri框架构建跨平台桌面应用:1、Tauri快速开始
  • 学习python的第十三天之函数——函数的返回值
  • 如何使用docker、docker挂载数据,以及让docker使用宿主机器的GPU环境 + docker重启小妙招
  • 华为云鸿蒙应用入门级开发者认证考试题库(理论题和实验题)
  • 论文阅读——Intrusion detection systems using longshort‑term memory (LSTM)
  • 阅读《先进引信技术的发展与展望》识别和控制部分_笔记
  • Glide源码学习
  • 【AI技术赋能有限元分析应用实践】将FEniCS 软件安装在Ubuntu22.04
  • 预训练模型与ChatGPT:自然语言处理的革新与前景
  • 【2024 Optimal Control 16-745】Ubuntu22.04 安装Julia
  • Edify 3D: Scalable High-Quality 3D Asset Generation 论文解读
  • 网络(TCP)