多线程相关概念
时间:2022-07-23
本文章向大家介绍多线程相关概念,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
相关概念
- 进程:启动一个应用程序,就会开启一个进程(微信,QQ,浏览器等等)
- 线程:程序的执行路径
- 进程和线程的区别:进程是在操作系统下的并发,线程是在应用程序下的并发
- 多线程:在同一进程中开启了多个不同的执行路径,多个路径同时执行
- 多线程好处:提高程序整体运行速度,快速响应
- 多线程的应用场景:
- 异步发送短信
- 异步记录日志
- 对耗时代码采用异步处理
- CPU切换: 单核CPU:同一时刻只有一个线程可以工作,线程上下文切换耗费资源 多核CPU:同一时刻多个线程同时工作,上下文切换较少
- 多线程越多越好? 小型项目:使用多线程异步 大型项目:使用MQ代替多线程
- 用户线程和守护线程的区别:
- 用户线程当主线程停止后,用户线程也会一直运行。thread.setDaemon(false);
- 而守护线程当我们主线程停止后,守护线程也会停止。thread.setDaemon(true);
停止线程的方式
建议采用变量的方式停止线程
public class Thread005 extends Thread {
private volatile boolean flag = true;
@Override
public void run() {
System.out.println(Thread.currentThread().getName());
while (flag) {
}
}
public void stopThread() {
this.flag = false;
}
public static void main(String[] args) {
Thread005 thread005 = new Thread005();
thread005.start();
try {
Thread.sleep(3000);
thread005.stopThread();
} catch (Exception e) {
}
}
}
多线程的5种状态
- 新建一个线程,new Thread的时候为新建的状态
- 调用到start方法的时候,当前线程状态为就绪状态,需要等待cpu的切换。
- 当cpu切换能够调用到该线程的时候,当前线程的状态为运行状态。
- 在线程调用sleep方法的时候,当前线程线程的状态为阻塞状态,当休眠的时候过了的时候有需要从新等待cpu调度,从就绪状态到运行。
- 当线程调用stop方法或者run方法代码执行结束的时候当前线程的状态为死亡状态。
join方法
当在主线程当中执行到t1.join()方法时,就认为主线程应该把执行权让给t1
class Main
{
public static void main(String[] args) {
Thread thread = new Thread(new Runnable() {
@Override
public void run() {
for (int i = 0; i <10 ; i++) {
System.out.println("子线程...");
}
}
});
thread.start();
try {
thread.join();
} catch (InterruptedException e) {
e.printStackTrace();
}
for (int i = 0; i <10 ; i++) {
System.out.println("main线程.....");
}
System.out.println("主线程销毁....");
}
}
- 机器学习线性分类算法:感知器原理
- 通过shell脚本来查看Undo中资源消耗高的sql(r2笔记88天)
- 关于分页查询的优化思路(r3笔记第7天)
- 用机器学习方法对影评与观影者情感判定
- 关于查看文件的几个小命令(r3笔记第6天)
- 关于纠结的recycle pool的设置(r3笔记第5天)
- 融会贯通学习trigger(r2笔记第4天)
- 完整的R语言预测建模实例-从数据清理到建模预测
- 利用回归模型预测数值型数据(代码)
- 关于ORA-00020问题的反思(r2笔记第3天)
- 查看空间使用情况的脚本(r2笔记第2天)
- 使用dbms_parallel_execute来完成DML的并行(r3笔记第1天)
- 有趣的linux命令总结(78天)
- 生产环境sql语句调优实战第七篇(r2笔记99天)
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- Tensorflow简单CNN实现详解
- 应用服务器安装手册
- python 读取文件函数
- Tkinter Menubar
- python pickle模块
- 吴恩达机器学习笔记18-逆矩阵、矩阵转置
- Tkinter messagebox弹窗
- 'utf-8' codec can't decode byte 0xff in position 0
- iOS今日头条第3轮面试回忆
- Python:os.path.join()产生的斜杠在Windows和Linux下的不同表现和解决方法
- python 深复制和浅复制详解
- Octave入门之数据操作—ML Note28
- matlab导出csv文件多种方法实现
- matlab面向对象编程基础
- Octave数据运算基础教程-ML Note29