【并发编程学习】一、线程的基本认识

news2024/12/23 1:16:11

一、线程的基本认识

1.1线程的基本介绍

线程是什么?

线程是操作系统能够进行运算调度的最小单位。它被包含在进程之中,是进程中的实际运行单位。

为什么会有多线程?

①因为其是CPU的最小调度单位,所以在多核CPU中,可以利用多CPU执行多线程可以实现真正意义上的并行执行

②在一个应用程序,会存在多个同时执行的任务,如果一个任务阻塞,那会引起不依赖该任务的任务也被阻塞。通过创建对不同任务不同的线程去处理,可以提高程序处理的实时性

③线程可以认为是轻量级的进程,所以线程的创建、销毁比进程更快

为什么要用多线程?

①异步执行②利用多CPU的资源实现真正意义上的并行执行

1.2多线程的应用场景

①使用多线程实现文件下载

②后台任务:如定时向大量的用户发送邮件

③异步处理:记录日志

④多步骤的任务处理,可根据步骤特征选用不同个数和特征的线程来协作处理,多任务的分割,由一个主线程分割为多个线程完成。

总结

多线程的本质是:合理利用多核心CPU资源来实现线程的并行处理,来实现同一个进程内的多个任务的并行执行,同时基于线程本身异步执行特性,提高任务处理的效率。

1.3如何在java中应用多线程

java中实现多线程的方式

①继承Thread类

public class ThreadDemo extends Thread {
    @Override
    public void run() {
        System.out.println("执行 "+ Thread.currentThread().getName());
    }

    public static void main(String[] args) {
        ThreadDemo thread=new ThreadDemo();
        thread.start();
    }
}

②实现Runnable接口

public class RunnableDemo implements Runnable{
    @Override
    public void run() {
        System.out.println("执行"+Thread.currentThread().getName());
    }

    public static void main(String[] args) {
        Thread thread=new Thread(new RunnableDemo());
        thread.start();
    }
}

③实现Callable接口

public class CallableDemo implements Callable {
    @Override
    public String call() throws Exception {
        return "Hello world ||"+Thread.currentThread().getName();
    }

    public static void main(String[] args) throws ExecutionException, InterruptedException {
        //线程池的创建
        ExecutorService service =Executors.newFixedThreadPool(1);
        //创建CallableDemo对象,加入线程池,去获取线程结果
        Future<String> future = service.submit(new CallableDemo());
        System.out.println(future.get()+"|||"+Thread.currentThread().getName());
    }

这三种实现方式的差异

Thread是以继承的方式、而Runnable和Callable是以实现的方式。继承只能继承一个类,不能多继承,而实现可以多个

1.4Java线程的生命周期

Java线程从创建到销毁,一共经历6个状态

NEW:初始状态,线程被构建,但还没有调用start方法

RUNNABLE:运行状态,JAVA线程把操作系统中的就绪状态和运行两种状态统一称为“运行状态”

合并了READY就绪状态和RUNNING运行状态

BLOCKED:阻塞状态,表示线程进入等待状态,也就是线程因为某种原因放弃了CPU使用权

当等待进入synchronized方法或代码块时

WAITING:等待状态

Object.wait()、Object.join()、LockSupport.park()

TIIME_WAITING:超时等待状态,超时后自动返回

Thread.sleep(long)、Object.wait(long)、Thread.join(long)

TERMINATED:终止状态,表示当前线程执行完毕

Jps //查看进程ID
Jstack PID //去查看进程日志,可以看到对应线程的状态

来源于:咕泡学院课程的学习总结

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/115894.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

圣诞节,深圳街头有点冷清了~

正文大家好&#xff0c;我是bug菌~今天是圣诞节&#xff0c;这也是我新冠康复的第二周了吧&#xff0c;还有点小咳嗽&#xff0c;伴随有点鼻炎&#xff0c;不过这周已经上了三天班了&#xff0c;整体感觉还算好吧&#xff0c;毕竟我嘴巴不硬&#xff0c;也比较低调不嚣张&#…

底层硬件创新夯实算力、应用创新贴近业务:英特尔至强助力下的VR医疗培训系统

早在1935年&#xff0c;科幻小说家斯坦利温鲍姆的小说《皮格马利翁的眼镜》中&#xff0c;就构想了一款实现虚拟现实&#xff08;VR&#xff09;的眼镜。近年来&#xff0c;除游戏、娱乐等大众熟知的应用场景外&#xff0c;VR逐渐涉足医疗、教育、生产制造等各种领域。 以医疗…

LeetCode-1759-统计同构子字符串的数目

1、数学 我们可以使用数学进行分析&#xff1a;每当出现连续的nnn个字符时&#xff0c;我们最终将其合在一起进行计算个数。显然我们可以获得的同构子字符串的个数应为n(n1)2\frac{n \times (n1)}{2}2n(n1)​。因此我们只需要遍历整个字符串&#xff0c;分别统计连续出现的字符…

57岛屿数量-61全排列 最长递增路径

57岛屿数量 矩阵中多处聚集着1&#xff0c;要想统计1聚集的堆数而不重复统计&#xff0c;那我们可以考虑每次找到一堆相邻的1&#xff0c;就将其全部改成0&#xff0c;而将所有相邻的1改成0的步骤又可以使用深度优先搜索&#xff08;dfs&#xff09;&#xff1a;当我们遇到矩阵…

AtCoder Beginner Contest 283 (A~F)

比赛名称&#xff1a;UNIQUE VISION Programming Contest 2022 Winter(AtCoder Beginner Contest 283) 比赛链接&#xff1a;AtCoder Beginner Contest 283 A - Power 题意&#xff1a; 求A^B(1<A,B<9) 要注意这个int强制转换&#xff0c;不然9^9输出结果时387420489&…

python根据json数据画疫情分布地图

目录 一.基础地图使用 1.掌握使用pyecharts构建基础的全国地图可视化图表 二.疫情地图——国内疫情地图 1.案例效果 代码 三.疫情地图——省级疫情地图 四.数据集 注&#xff1a;数据集在文章最后 一.基础地图使用 1.掌握使用pyecharts构建基础的全国地图可视化图表 演…

Learning to Segment Every Thing

摘要 现有的目标实例分割方法要求所有训练样本都具有分割mask标注。然而&#xff0c;标注新的类别是非常费劲的&#xff0c;因此这将实例分割模型的应用范围限制在100个左右的有标注的类。本文的目的是提出一种新的部分监督的训练模型&#xff0c;以及一种新的权重传递函数&am…

洛谷【算法1-7】搜索刷题——优化、错题

文章目录[USACO1.5]八皇后 Checker Challenge题目描述输入格式输出格式样例 #1样例输入 #1样例输出 #1提示思路搜索框架代码位运算优化lowbit运算思路kkksc03考前临时抱佛脚题目背景题目描述输入格式输出格式样例 #1样例输入 #1样例输出 #1提示思路代码吃奶酪题目描述输入格式输…

C++ STL 之可变长数组 Vector 详解

文章目录Part.I AttentionChap.I 注意事项Chap.II 操作技巧Part.II FunctionChap.I 构造函数Chap.II 增加函数Chap.III 删除函数Chap.IV 遍历函数Chap.V 判断/大小/其他函数Part.III CodePart.I Attention Chap.I 注意事项 使用vector需要注意的地方&#xff1a; 加引用#inc…

分布式与微服务系列 - SpringBoot + Zookeeper集群 + Dubbo分布式托管(提供者、消费者)+ Nginx反向代理

一、前言 本内容仅用于个人学习笔记&#xff0c;如有侵扰&#xff0c;联系删除 再搭建集群项目前&#xff0c;请先学习相关技术的知识&#xff1a; 分布式与微服务系列 - Dubbo分布式与微服务系列 - Zookeeper上篇&#xff1a;入门到精通参考文档&#xff1a;分布式与微服务…

状态机——奇葩的状态表示

状态机——奇葩的状态表示 简述 在动态规划中&#xff0c;遇到有一个点有多个状态&#xff0c;混在一起无法表示&#xff0c;那么就可以把状态分开&#xff0c;并且构造出不同状态之间的转移关系&#xff0c;然后再求出状态转移方程&#xff0c;之后就OK了。 题目 1049. 大…

GNN algorithms(3): Tri-party Deep Network Representation

目录 Tri-party Deep Network Representation Essence Thinking Abstract Introduction Problem Definition Tri-DNR pipelines Model Architecture Tri-party Deep Network Representation Essence 1) Deepwalk提取graph structure信息&#xff0c;即structural nod…

MyBatis 一文基础总结

MyBatis 一文基础总结老师的随堂上课笔记&#xff0c; 供参考~1.框架概述1.1 软件开发常用结构1.1.1三层架构三层的处理请求的交互&#xff1a;用户---> 界面层--->业务逻辑层--->数据访问层--->DB 数据库1.1.2 常用框架常见的 J2EE 中开发框架&#xff1a;MyBatis…

adworld-web-inget-20221226

inget 题目来源: 宜兴网信办 题目描述: 无 题目场景: http://61.147.171.105:51222 http://61.147.171.105:51222/?id1%27%20%20or%2011%20– Please enter ID,and Try to bypass nice : congratulations Flag Is : cyberpeace{3df1eecfb5f794d6a94eba429f7e2846} ┌…

【NI Multisim 14.0编辑环境——菜单栏】

目录 序言 一、菜单栏 &#x1f349;1.文件 &#x1f349;2.编辑 &#x1f349;3.视图 &#x1f349; 4.绘制 &#x1f349;5.MCU&#xff08;微控制器&#xff09;菜单 &#x1f349; 6.仿真 &#x1f349; 7.转移 &#x1f349; 8.工具 &#x1f349; 9.报告 &…

录屏有声音吗?电脑如何录屏有声音?图文教程来了!

无论是学习、办公还是娱乐&#xff0c;都需要屏幕录制。许多人在录制视频后发现视频没有发出声音。录屏有声音吗&#xff1f;电脑如何录屏有声音&#xff1f;一个相对简单的方法是在使用电脑的屏幕录制功能时检查是否打开录制屏幕的声音。此外&#xff0c;如果您担心每次都需要…

这应该是全网最全的MySQL数据库的常用命令了吧

目录 前言 数据库的创建 数据表的操作 表数据的增删查改 分组与函数查询 分组与函数查询 运算符&#xff1a;数学运算符 连接查询 前言 今天给大家点来MySQL数据库的常用命令总结&#xff0c;这应该是全网最详细&#xff0c;最实用的数据库命令总结了&#xff0c;因为命…

addr2line

1、符号表 1.1什么是符号表 符号表是内存地址与函数名、文件名、行号的映射表。符号表元素如下所示&#xff1a; <起始地址> <结束地址> <函数> [<文件名:行号>] 1.2为什么要配置符号表 为了能快速并准确地定位引擎发生Crash的代码位置 举个例子…

【UE4 第一人称射击游戏】16-重新装弹

上一篇&#xff1a; 【UE4 第一人称射击游戏】15-修复蹲伏和冲刺同时执行的bug 本章效果&#xff1a; 步骤&#xff1a; 1.打开“Weapon_Base”&#xff0c;添加两个整数类型变量&#xff0c;分别命名为“MaxAmmo”和“ClipSize”&#xff0c;表示最大载弹量和每次重新装弹的…

MATLAB多项式符号运算

符号计算是指在运算时&#xff0c;无须事先对变量进行赋值&#xff0c;而是将所有得到的结果以标准的符 号形式表示出来。符号计算是以符号对象和符号表达式作为运算对象的表达形式&#xff0c;最终给出 的是解析解;在运算过程中不会受到计算误差累积问题的影响&#xff0c;其计…