线程的使用

956abe65febc48a0828190bd9b9d4219.gif线程的创建方式

 

 

1、实现Runnable

 

Runnable规定的方法是run(),无返回值,无法抛出异常 实现Callable

 

2、Callable规定的方法是call(),任务执行后有返回值,可以抛出异常

 

3、继承Thread类创建多线程

 

继承java.lang.Thread类,重写Thread类的run()方法,在run()方法中实现运行在线程上的代码,调用start()方法开启线程。 Thread 类本质上是实现了 Runnable 接口的一个实例,代表一个线程的实例。启动线程的唯一方法就是通过 Thread 类的 start()实例方法。start()方法是一个 native 方法,它将启动一个新线程,并执行 run()方法 通过线程池创建线程. 线程和数据库连接这些资源都是非常宝贵的资源。那么每次需要的时候创建,不需要的时候销毁,是非常浪费资源的。那么我们就可以使用缓存的策略,也就是使用线程池。

 

wait和Sleep的区别

 

sleep wait

 

不释放锁对象 释放锁对象,需要notify进行唤醒

 

在任何地方(可以定时) 同步方法,同步代码块

 

必须捕获异常 不要捕获异常

 

线程和进程

 

线程 进程

 

系统运行的基本单位,程序执行的最小单位 系统资源分配和调度的基本单位

 

线程状态

 

新建 就绪 运行 阻塞 销毁

 

synchronized和Lock的区别

 

synchronized lock

 

主动释放锁 final里面进行强制释放

 

不可中断,非公平锁 可以判断,公平锁

 

少量同步 大量同步  

 

独占锁 公平锁和非公平锁

 

多线程之间如何通信

 

1、使用volalite修饰变量,进行变量共享

 

2、使用wait

 

线程池参数

 

1、线程池大小

 

# 初始连接数

initialSize: 5

# 最小连接池数量

minIdle: 10

# 最大连接池数量

maxActive: 20

2、最大线程数量

 

3、空闲线程存活时间

 

4、工作队列

 

5、线程工厂

 

线程的拒绝策略

 

线程自旋锁

自旋锁是一种多线程同步的变量;

 

使用自旋锁的线程会反复检查锁变量是否可用,如果不可用会一直循环反复检查;

 

自旋锁不会让出CPU,是一种忙等待状态; 自旋锁是一种死循环等待锁被释放;

 

 join和yield

 

join的原理就是wait方法

 

t.join()表示等待t线程执行完毕后再执行

 

join线程有严格的先后顺序,调用它的线程需要执行完以后其他线程才会跟着执行。

 

 

 

yield 是指线程让步,使其线程从运行状态变为启动状态

 

当一个线程调用yield时会把这个线程的锁 ,抛出去,使其和它一样优先级的线程进行获取锁,当然这个线程本身也会参与锁的竞争,并有可能获取锁对象,重新执行

 

yield是暂停当前正在执行的线程对象,把时间让给其他线程。

 

使用场合:join线程有严格的先后顺序,yield当前线程占用cpu使用率很高时,把时间让出来。(死循环时)

 

线程的优先级

线程的优先级就是设置哪个线程优先执行,但也不是绝对的,只是让优先级高的线程优先运行的几率高一些。

线程默认是NORM_PRIORITY = 5; 设置优先级使用的是setPriority()函数。

Tread里面的方法大多数是final进行修饰的,防止继承的时候进行修改

 线程间的相互通信

 

线程间是通过相互作用,共同完成一个任务当一个线程调用wait方法后便进入等待状态,需要另一线程调用notify()方法对它进行唤醒。

 

notifyAll可以唤醒所有线程,都必须在synchronized方法或synchronized块里使用

 

 wait ,notify , notifyAll都必须在synchronized修饰的方法或synchronized块中使用,都属于Object的方法,可以被所有类继承,都是final修饰的方法,不能通过子类覆写去改变他们的行为。

处理线程安全的措施

1、放在栈里面的数据都是线程安全的

2、同步关键字或者同步代码块

3、final修饰的变量都是线程安全的

4、TreadLoad放置的变量

5、使用线程安全的集合和类等

stop

stop()方法作为一种粗暴的线程终止行为,在线程终止之前没有对其做任何的清除操作,因此具有固有的不安全性。

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

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

相关文章

计算机毕业设计 基于Java的美食信息推荐系统的设计与实现 Java实战项目 附源码+文档+视频讲解

博主介绍:✌从事软件开发10年之余,专注于Java技术领域、Python人工智能及数据挖掘、小程序项目开发和Android项目开发等。CSDN、掘金、华为云、InfoQ、阿里云等平台优质作者✌ 🍅文末获取源码联系🍅 👇🏻 精…

docker使用nginx部署vue刷新页面404

docker使用nginx部署vue刷新页面404 从docker内部复制出来的配置文件是这样的,但是刷新页面之后就显示404,关键是我两个前端项目都是用的这一个配置文件,但是只有一个项目出现刷新浏览器显示404的问题,这给我搞懵了!&…

UG全参数化建模

在UG全参数化建模中,可以先创建表达式再设计图形,也可先设计图形再关联表达式 UG表达式类型有:数字,字符串,布尔,整数,点,矢量,列表 数字:在数字类型中&…

Python教程44:海龟画图turtle画卡塔尔世界杯吉祥物

---------------turtle源码集合--------------- Python教程42:海龟画图turtle画海绵宝宝 Python教程41:海龟画图turtle画蜡笔小新 Python教程40:使用turtle画一只杰瑞 Python教程39:使用turtle画美国队长盾牌 Python教程38&a…

mathtype2024版本下载与安装(mac版本也包含在内)

安装包补丁主要是mathtype的安装包,与它的补丁。 详细安装过程: step1: 使用方法是下载完成后先安装MathType-win-zh.exe文件,跟着步骤走直接安装就行。 step2: 关闭之后,以管理员身份运行MathType7PJ.exe…

DHCP中继【新华三】

理论【DHCP服务器可以对其直连的网段中的pc,分配其IP地址等服务,但是,对于跨网段进行分配IP地址,需要中间有DHCP中继进行传达,由DHCP中继指定DHCP服务器的位置,可以很好的对其跨网段分配IP地址起到指引的作…

Android14实战:打破音频默认重采样的限制(五十二)

简介: CSDN博客专家,专注Android/Linux系统,分享多mic语音方案、音视频、编解码等技术,与大家一起成长! 优质专栏:Audio工程师进阶系列【原创干货持续更新中……】🚀 优质专栏:多媒体系统工程师系列【原创干货持续更新中……】🚀 人生格言: 人生从来没有捷径,只…

yum仓库及NFS共享

目录 一、yum仓库 (一)yum仓库简介 (二)实现过程 (三)yum命令 (四)搭建内网yum仓库 1.FTP服务搭建yum仓库 ①服务端操作 ②客户端操作 2.http服务搭建yum仓库 ①服务端操作…

新版网易全套识别验证

认真往下看,保证这篇文章B格拉满!!!! 距离上次版本更新已经过去好久了,当时只做了滑块,后面朱哥发了一套网易完整版的给我,完事儿也没来得及去看就更新了。 先盘点一下这次更新都做了…

用Python“自动连发消息”

自动连发消息,基本上C和Python的思路都是不停的模拟“击键”操作,还有一种VB的脚本写法,反成每种语言都能写,更厉害的可以用java做出个GUI界面,先上代码。 一 代码 import pyautogui # 鼠标 import p…

【linux】visudo

碎碎念 visudo命令是用来修改一个叫做 /etc/sudoers 的文件的,用来设置哪些 用户 和 组 可以使用sudo命令。并且使用visudo而不是使用 vi /etc/sudoers 的原因在于:visudo自带了检查功能,可以判断是否存在语法问题,所以更加安全 …

在线录屏-通过Web API接口轻松实现录屏

在线录屏是指在互联网上进行屏幕录制的过程。它允许用户通过网络连接,将自己的屏幕活动记录下来,并可以在需要时进行播放、共享或存档。在线录屏常用于教育、培训、演示、游戏等场景,可以帮助用户展示操作步骤、解决问题、分享经验等。通常&a…