java多线程详解

线程是操作系统能够进行运算调度的最小单位。它被包含在进程之中,是进程中的实际运作单位。简单理解为:引用软件中相互独立,可以同时允许的功能

进程是程序的基本执行实体

并发:在同一时刻,有多个指令在单个CPU上交替执行

并行:在同一时刻,有多个指令在多个CPU上同时执行

多线程的实现方式

  • 继承Thread类的方式进行实现
  • 实现Runnable接口进行实现
  • 利用Callable接口和Future接口的方式实现

方式一:

//将类声明为Thread类的子类,重写Thread类的run方法。
class MyThread() extends Thread{public void run(){//这里书写要执行的代码System.out.print("hello,xun");//System.out.print(getName())//获取当前线程的线程名}
}MyThread mythread = new MyThread();
mythread.start();//启动线程mythread.setName("线程一")//给线程起名字

方式二:

//声明实现Runnable接口的类,该类实现run方法。
class MyThread() implements Runnable{public void run(){//这里书写要执行的代码System.out.print("hello,xun");//获取当前线程对象Thread t = Thread.currentThread();t.getName();//获取当前线程的线程名}
}
//表示多线程要执行的任务
MyThread mythread = new MyThread();
//创建线程对象
Thread t = new Thread(mythread);
//开启线程
t.start(); t.setName("线程一")//给线程起名字

方式三:

//利用Callable接口和Future接口的方式实现
//特点:可以获取到多线程运行的结果
class MyCallable implements Callable<Integer>{//该线程返回值的类型public Integer call() throws Exception{//求1—100之间的和int sum=0;for(int i = 1;i<=100;i++){sum+=i;}return sum;}
}
//创建MyCallable的对象(表示多线程要执行的任务)
MyCallable mc = new MyCallable();
//创建FutureTask的对象(作用是管理多线程的运行结果)
FutureTask<Integer> ft = new FutureTask<>(mc);
//创建线程的对象
Thread t = new Thread(ft);
t.start();
//获取多线程的运行结果
Integer res = ft.get();

在这里插入图片描述

多线程中常用的成员方法

在这里插入图片描述

  1. 如果我们没有给线程设置名字,线程也是有默认名字的,格式:Thread-X(X是序号,从0开始)
  2. 如果给线程设置名字,有两种方法,1.通过setName设置线程名 2.通过构造函数设置线程名
  3. 当JVM虚拟机启动后,会自动运行多条线程,其中有一条线程叫main线程,他的作用就是调用main方法,执行里面的代码
  4. 线程的优先级,最小的是1,最大的10,默认是5;优先级越大,抢到CPU的概率越大
  5. 当其他的非守护线程执行完毕之后,守护线程会陆续结束(可能不会将自己的程序运行完)
  6. t.join()//表示将线程t插入到当前线程之前

线程的声明周期

在这里插入图片描述

线程安全问题

线程的执行有随机性,这样会导致线程存在安全问题

解决方法:

同步代码块:把操作共享的代码锁起来

synchronized(锁对象){//操作共享的代码块
}
//特点一:锁默认打开,有一个线程进去了,锁自动关闭
//特点二:里面的代码全部执行完毕,线程出来,锁自动打开
//锁对象一定是唯一的,一般是锁对象的字节码文件对象
synchronized(thread.class);

同步方法:把synchronized关键字加到方法上

格式:修饰符 synchronized 返回值类型 方法名(方法参数){...}
//特点一:同步方法是锁住方法里面的所有方法
//特点二:锁对象不能自己指定非静态方法:this静态方法:当前类的字节码文件对象

为了更加清晰的表达如何释放锁,获得锁,JDK5之后提供了一个锁对象Lock

void lock()//获得锁
void unlock()//释放锁//手动释放锁,手动获得锁

Lock是接口不能被直接实例化,使用它的实现类ReentrantLock来实例化

死锁

出现了锁的嵌套

产生因素

1、系统拥有的资源数量
2、资源分配策略
3、进程对资源的使用要求
4、并发进程的推荐顺序

必要条件

  • 互斥条件:进程互斥使用资源
  • 占有和等待条件:进程申请资源得不到时,不会释放已经占有的资源
  • 不剥夺条件:一个进程不能抢占其他进程的资源
  • 循环等待条件:存在一组进程循环等待资源

死锁的防止

破坏产生死锁的任意一个条件即可

生产者和消费者(等待唤醒机制)

生产者:生产数据

消费者:消费数据

常见方法:

public void wait();//当前线程等待,知道被其他线程唤醒public void notify();//随机唤醒一个线程public void notifyAll();//唤醒所有线程

线程的状态

在这里插入图片描述

新建状态(new)			->			创建线程对象就绪状态(Runnable)			->			start方法阻塞状态(blocked)			->			无法获得锁对象等待状态(waiting)			->			wait方法		计时状态(timed_waiting)			->			sleep方法结束状态(terminated)			->			全部代码运行完毕

线程池

以前使用多线程的弊端:

​ 用到线程时就创建

​ 用完之后线程消失

这样会浪费操作系统的资源

线程池:类似于一个容器,里面有线程,需要用到线程时,直接取即可,用完还回去。

线程池有最大线程数量限制,可以自己设置

1. 创建一个空池子
2. 提交任务时,池子会创建新的线程对象,任务执行完毕,归还线程对象到线程池,下次调用时,直接使用,不需要创建
3. 如果提交任务时,没有空闲线程,也无法创建新的线程,任务就会排队等待

线程池:类似于一个容器,里面有线程,需要用到线程时,直接取即可,用完还回去。

线程池有最大线程数量限制,可以自己设置

1. 创建一个空池子
2. 提交任务时,池子会创建新的线程对象,任务执行完毕,归还线程对象到线程池,下次调用时,直接使用,不需要创建
3. 如果提交任务时,没有空闲线程,也无法创建新的线程,任务就会排队等待

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

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

相关文章

C++类和对象(3)

目录 1.类的6个默认成员函数 2. 构造函数 2.1 概念 2.2 特性 3.析构函数 3.1 概念 3.2 特性 4. 拷贝构造函数 4.1 概念 4.2 特征 1.类的6个默认成员函数 如果一个类中什么成员都没有&#xff0c;简称为空类。 空类中真的什么都没有吗&#xff1f;并不是&#xff0c;任…

Linux服务详解

如有错误或有补充&#xff0c;以及任何改进的意见&#xff0c;请在评论区留下您的高见&#xff0c;同时文中给出大部分命令的示例&#xff0c;即是您暂时无法在Linux中查看&#xff0c;您也可以知道各种操作的功能以及输出 如果觉得本文写的不错&#xff0c;不妨点个赞&#x…

C++ easyx 结合C++实现 画同心圆。

easyx 结合C实现 画同心圆。 #include<graphics.h> #include<conio.h>int main() {initgraph(666, 666); // 初始化为 666*666 的画布/* circle */setcolor(BLUE); //circle 的线条为某色setfillcolor(YELLOW); //circle 内某色填充 setlinestyle(PS_…

基于 Echarts 的 Python 图表库:Pyecahrts交互式的日历图和3D柱状图

文章目录 概述一、日历图和柱状图介绍1. 日历图基本概述2. 日历图使用场景3. 柱状图基本概述4. 柱状图使用场景 二、代码实例1. Pyecharts绘制日历图2. Pyecharts绘制2D柱状图3. Pyecharts绘制3D柱状图 总结 概述 本文将引领读者深入了解数据可视化领域中的两个强大工具&#…

关于VxTerm有可能通过SSH协议默认情况下不能正常连接华为S5735交换机的解决办法

此方法为网友&#xff1a;刘春&#xff08;QQ282867758&#xff09;多次测试后找到的解决办法。 在此感谢他&#xff01;谢谢&#xff01; 默认情况下&#xff0c;VxTerm与S5735建立SSH连接时采用的Kex Exchange算法为&#xff1a;diffie-hellman-group-exchange-sha256&…

Python使用fastAPI实现一个流式传输接口

1. 使用fastapi实现流式传输 1.1 服务端 fastapi_server.py 编写服务端代码fastapi_server.py。服务端代码主要使用了fastapi和uvicorn两个库。 #!/usr/bin/env python # codingutf-8 # Time : 2024/1/31 19:13 # Software: PyCharm from fastapi import FastAPI from fa…

大数据 - Hadoop系列《三》- MapReduce(分布式计算引擎)概述

上一篇文章&#xff1a; 大数据 - Hadoop系列《三》- HDFS&#xff08;分布式文件系统&#xff09;概述-CSDN博客 目录 12.1 针对MapReduce的设计构思 1. 如何对付大数据处理场景 2. 构建抽象编程模型 3. 统一架构、隐藏底层细节 12.2 分布式计算概念 12.3 MapReduce定义…

如何通过CVE漏洞编码找到对应的CVE漏洞详情及源码修改地址

背景&#xff1a; 最近正在使用docker进行一些cve漏洞的复现&#xff0c;有时候就要通过CVE的漏洞编码&#xff0c;找到对应的漏洞详情&#xff0c;以及漏洞的源码修改 以我上一篇文章的CVE-2020-17518编码为例 Apache Flink文件上Apache Flink文件上 方法&#xff1a; 通…

手写分布式存储系统v0.2版本

引言 上回说到 手写分布式存储系统v0.1版本 &#xff0c;已经实现了通过监听TCP端口并将数据写到本地磁盘的功能&#xff0c;今天咱们就继续往上面添砖加瓦 v0.2版本大致做以下功能 实现滚动写文件 代码优化 一、滚动写文件实现 由于咱们写文件是用的mmap进行文件写入&am…

解决ModuleNotFoundError: No module named ‘pysqlite2‘

目录 一、问题描述 二、问题分析 三、解决方法 四、参考文章 一、问题描述&#xff1a; 新建conda编译环境。安装Jupyter后打不开&#xff0c;报错&#xff1a; 二、问题分析&#xff1a; 缺少sqlite3动态链接库 三、解决方法&#xff1a; SQLite Download Page 下载…

数字地球开放平台农作物长势监测解决方案

利用遥感技术进行产量预测是一种高效而准确的方法&#xff0c;通过监测植被的生长状况、土地利用、气象等因素&#xff0c;可以为农业决策提供有力支持。数字地球开放平台拥有200颗卫星&#xff0c;为您提供一站式卫星遥感服务。 数字地球开放平台将为您介绍一般遥感技术在农作…

游戏开发丨基于Panda3D的迷宫小球游戏

文章目录 写在前面Panda3D程序设计程序分析运行结果系列文章写在后面 写在前面 本期内容 基于panda3d的迷宫中的小球游戏 所需环境 pythonpycharm或anacondapanda3d 下载地址 https://download.csdn.net/download/m0_68111267/88792121 Panda3D Panda3D是一种开放源代码…

如何选择最适合的服务器

许多朋友想做一些网站&#xff0c;应用&#xff0c;游戏&#xff0c;小程序等等&#xff0c;都需要接触一个基础&#xff0c;就是服务器。服务器相当于一台24小时不关机的联网电脑&#xff0c;浏览网页或者应用相当于用户在访问这台电脑里的文件。那么如何选择最适合自己的服务…

【Java 数据结构】对象的比较

Java中对象的比较 1. PriorityQueue中插入对象2. 元素的比较2.1 基本类型的比较2.2 对象比较的问题 3. 对象的比较3.1 覆写基类的equals3.2 基于Comparble接口类的比较3.3 基于比较器比较3.4 三种方式对比 4. 集合框架中PriorityQueue的比较方式5. 使用PriorityQueue创建大小堆…

【AI_Design】Midjourney学习笔记

目录 后缀解析Promot合格使用prompt关键词描述 关键词化合作用关键词网站推荐 联合Chatgpt使用总结 后缀解析 –ar&#xff1a;宽高比设置–c&#xff1a;多样性设置&#xff08;数值0-100&#xff0c;默认值0&#xff09;–s&#xff1a;风格化设置&#xff08;数值0-1000&am…

Java面试——计网篇

一、基础篇 1、 TCP/IP 网络模型 对于同一台设备上的进程间通信&#xff0c;有很多种方式&#xff0c;比如有管道、消息队列、共享内存、信号等方式&#xff0c;而对于不同设备上的进程间通信&#xff0c;就需要网络通信&#xff0c;而设备是多样性的&#xff0c;所以要兼容多…

结构体--共用体--枚举 之难点——链表 奋力学习嵌入式的第十六天

结构体 注意&#xff1a; 1.结构体类型 可以定义在 函数里里面 但是此时作用域就被限定在该函数中 2.结构体定义形式 //形式一 限定一类型 后定义变量 struct stu { ... }; struct stu s; //形式二 定义类型的同时 定义变量 struct stu { ... }s1,s2,*s3,s4[10]; struc…

影院购票|电影院订票选座小程序|基于微信小程序的电影院购票系统设计与实现(源码+数据库+文档)

电影院订票选座小程序目录 目录 基于微信小程序的电影院购票系统设计与实现 一、前言 二、系统功能设计 三、系统实现 1、用户功能实现 2、管理员功能实现 &#xff08;1&#xff09;影院信息管理 &#xff08;2&#xff09;电影信息管理 &#xff08;3&#xff09;已…

STM32F1 - 存储器映射

Memory mapping 1> 外设内存地址映射2> GPIO寄存器映射3> 存储器访问 1> 外设内存地址映射 1> STM32F103ZET6的地址线位宽为32位&#xff0c;所以寻址空间为4GB &#xff08;2 ^ 32 4GB&#xff09;&#xff1b; 2> STM32将&#xff0c;Flash&#xff0c;SR…

PageHelper.startPage(pageNum, pageSize);分页总数不正确,避坑!

今天在调用一个查询列表的接口时&#xff0c;分页总数老是查的不正确&#xff1a; 当pageSize选择10时&#xff0c;总数只有10条 当pageSize选择20时&#xff0c;总数只有15条 实际上总数为15条实在正确的&#xff0c;然后取看代码&#xff1a; Overridepublic AjaxResult pro…