并发(2)

目录

6.通常线程有哪几种使用方式?

7.基础线程机制有哪些?

8.线程的中断方式有哪些?

9.线程的互斥同步方式有哪些?如何比较和选择?

10.Synchronized可以作用在哪里?


6.通常线程有哪几种使用方式?

有三种使用线程的方法:

实现Runnable接口;

实现Callable接口;

集成Thread类。

实现Runnable和Callable接口的类只能当做一个可以在线程中运行的任务,不是真正意义上的线程,因此最后还需要通过Thread来调用。可以说任务是通过线程驱动从而执行的。

7.基础线程机制有哪些?

Executor管理多个异步任务的执行,而无需程序员显式地管理线程的生命周期。这里的异步是指多个任务的执行互不干扰,不需要进行同步操作。

主要有三种Excutor:

1.CachedThreadPool:一个任务创建一个线程;

2.FixedThreadPool:所有任务只能使用固定大小的线程。

3.SingleThreadExecutor:相当于大小为1的FixedThreadPool。

Daemon

守护线程是程序运行时在后台提供服务的线程,不属于程序中不可或缺的部分。

当所有非守护线程结束时,程序也就终止,同时会杀死所有守护线程。

main()属于非守护线程。使用setDaemon()方法将一个线程设置为守护线程。

sleep()

Thread.sleep(millisec)方法会休眠当前正在执行的线程,Millisec单位为毫秒。

sleep()可能会抛出InterruptedException,因为异常不能跨线程传播回main()中,因此必须在本地进行处理。线程中抛出的其他异常也同样需要在本地进行处理。

yield()

对静态方法Thread.yield()调用声明了当前线程已经完成了声明周期中最重要的部分,可以切换给其他线程来执行。该方法只是对县城调度器的一个建议,而且也只是建议具有相同优先级的其他线程可以运行。

8.线程的中断方式有哪些?

一个线程执行完毕之后会自动结束,如果在运行过程中发生异常也会提前结束。

InterruptedException

通过调用一个线程的interrupt()来中断该线程,如果该线程处于阻塞,限期等待或者无限期等待状态,那么就会抛出InterruptedException,从而提前结束该线程。但是不能中断I/O阻塞和synchronized锁阻塞。

对于以下代码,在main()中启动一个线程之后再中断他,由于线程中调用了Thread.sleep()方法,因此会抛出InterruptedException,从而提前结束线程,不执行之后的语句。

 

interrupted()

如果一个线程的run()方法执行一盒无限循环,并且没有执行sleep()等会抛出InterruptedException的操作,那么调用线程的interrupt()方法就无法使线程提前结束。

但是调用interrupt()方法会设置线程的中断标记,此时调用Interrupt()方法会返回true。因此可以在循环体中使用interrupted()方法来判断线程是否处于中断状态,从而提前结束线程。

Excutor的中断操作

调用Excutor的shutdown()方法会等待线程都执行完毕后再关闭,但是如果调用的是shutdownNow()方法,则相当于调用每个线程的interrupt()方法。

9.线程的互斥同步方式有哪些?如何比较和选择?

Java提供了两种锁机制来控制多个线程对共享资源的互斥访问,第一个是JVM实现的synchronized,而另一个是JDK实现的ReentrantLock。

1.锁的实现

synchronized时JVM实现的,而ReentrantLock是JDK实现的。

2.性能

新版本Java对Synchronized进行了很多优化,例如自旋锁等,synchronized与ReentrantLock大致相同。

3.等待可中断

当持有锁的线程长期不释放锁的时候,正在等待的线程可以选择放弃等待,改为处理其他事情。ReentrantLock可中断,而synchronized不行。

4.公平锁

公平锁是指多个线程在等待同一个锁时,必须按照申请锁的时间顺序来一次获得锁。synchronized中的锁是非公平的,ReentrantLock默认情况下也是非公平的,但是也可以是公平的。

5.锁绑定多个条件

一个ReentrantLock可以同时绑定多个Condition对象。

10.Synchronized可以作用在哪里?

对象锁

方法锁

类锁

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Python基础知识总结3-面向对象进阶知识

面向对象三大特征介绍 继承子类扩展父类语法格式关于构造函数:类成员的继承和重写查看类的继承层次结构 object根类dir() 查看对象属性重写 __str__() 方法 多重继承MRO方法解析顺序super()获得父类定义多态特殊方法和运算符重载特殊属性 对象的浅拷贝和深拷贝组合_…

【提示学习论文五】Conditional Prompt Learning for Vision-Language Models论文原理及复现工作

Conditional Prompt Learning for Vision-Language Models 视觉语言模型的条件提示学习 文章介绍 这篇文章于2022年发表在CVPR(Conference on Computer Vision and Pattern Recognition),作者是kaiyang.zhou, jingkang001, ccloy, ziwei.li…

PostgreSQL的常见错误和解决方法

转载说明:如果您喜欢这篇文章并打算转载它,请私信作者取得授权。感谢您喜爱本文,请文明转载,谢谢。 在学习新的东西时,会犯很多的错误,会遇到很多坑。我们在填坑与犯错中不断进步成长。 以下是在学习pgsql中…

【QT】自定义代理类

目录 1 我们为什么要使用自定义代理类? 2 自定义代理类的基本设计要求 3 自定义代理的功能 4 基于QSpinBox的自定义代理类 5 自定义代理类的使用 1 我们为什么要使用自定义代理类? 传统的模型-视图框架可以让我们实现逻辑展示相分离,我们…

trino-435:dynamic catalog数据库存储代码实现

一、dynamic catalog数据库存储源码分析 dynamic catalog的实现主要涉及到两个类:CoordinatorDynamicCatalogManager、WorkerDynamicCatalogManager,这两个类的详细信息如下: 这两个类主要提供了对catalog的增删改查的方法。trino-435源码中…

C++补充内容--EasyX-UI界面

esay x 其他 地图打印(利用二维数组) 双缓冲 当我们绘制一张图 然后另一张图盖住前一张图的某个部分的时候 由于while的存在 会导致 两张图不停的闪烁 所以加入双缓冲可以解决这个问题 开启双缓冲 之后等待Flush或者End 才会进行图片的绘制 不然不会进行图片的绘制,这样就可…

docker拉取镜像提示 remote trust data does not exist for xxxxxx

1、How can I be sure that I am pulling a trusted image from docker 2、docker: you are not authorized to perform this operation: server returned 401. 以上两个问题可以试试以下解决办法 DOCKER_CONTENT_TRUSTfalse 本人是使用jenkins部署自己的项目到docker容器出现…

Linux基础——进程初识(二)

1. 对当前目录创建文件的理解 我们知道在创建一个文件时&#xff0c;它会被默认创建到当前目录下&#xff0c;那么它是如何知道当前目录的呢&#xff1f; 对于下面这样一段代码 #include <stdio.h> #include <unistd.h>int main() {fopen("tmp.txt", …

51单片机串行口相关知识

51单片机串行口相关知识 串行通信概念 计算机与外部通信方式就两种&#xff1a; 并行通信串行通信 两种通信方式的特点以及适用场景&#xff1a; 名称特点适用场景并行通信速度快&#xff0c;效率高&#xff0c;成本高适合短距离高速通信&#xff0c;如计算机内部各硬件之…

MySQL-DDL

DDL是数据定义语言&#xff0c;用来定义数据对象&#xff08;数据库&#xff0c;表&#xff0c;字段&#xff09; 数据库操作&#xff1a; 1.查询&#xff1a; 查询所有数据库&#xff1a;SHOW DATABASES; 查询当前数据库&#xff1a;SELECT DATABASE(); 2.创建&#xff1a; C…

性能分析与调优: Linux 使用 iperf3 进行TCP网络吞吐量测试

目录 一、实验 1.环境 2.TCP网络吞吐量的微观基准测试 二、问题 1.iperf参数有哪些 2.iperf如何二进制安装 一、实验 1.环境 &#xff08;1&#xff09;主机 表1-1 主机 主机架构组件IP备注prometheus 监测 系统 prometheus、node_exporter 192.168.204.18grafana监测…

BLE Mesh蓝牙组网技术详细解析之Model Layer模型层(八)

目录 一、什么是BLE Mesh Model Layer模型层&#xff1f; 二、SIG Model 2.1 模型概念 2.2 消息格式 2.3 开关模型 四、资料获取 一、什么是BLE Mesh Model Layer模型层&#xff1f; Models Layer的作用是定义了一些通用的或特定的模型&#xff0c;用于实现网络节点设备…

UE5 VR版增强输入初体验 官方模板学习

问题 我们传统的输入方式&#xff0c;是通过编辑器设置输入操作映射&#xff0c;然后BindAction和BindAxis绑定 这边插播一条增强输入知识点&#xff0c;参考知乎大佬文章 和增强输入的VR模板教学&#xff1a;如何使用VR模板在UE5中使用增强输入系统_哔哩哔哩_bilibili 实践操…

Agilent安捷伦E4407B频谱分析仪26.5GHz

E4407B是安捷伦ESA-E系列频谱分析仪&#xff0c;它是一款能够适应未来需要的中性能频谱分析仪解决方案。该系列在测量速度、动态范围、精度和功率分辨能力上&#xff0c;都为类似价位的产品建立了性能标准。其灵活的平台设计使得研发、制造和现场服务工程师能够自定义产品&…

输电线路分布式故障诊断装置的应用-深圳鼎信

输电线路分布式故障诊断装置是一种利用分布式行波法实现故障定位的设备&#xff0c;它的应用场景、类型和功能特点如下&#xff1a; 一、应用场景 分布式故障定位装置适用于各种复杂环境的高压输电线路&#xff0c;例如三跨线路&#xff08;跨越铁路、一级及以上公路和重要输…

利用注解和反射处理方法级别的逻辑

1. 定义自定义注解 首先&#xff0c;我们定义一个自定义注解 MyAnnotation&#xff0c;用于标记需要特殊处理的方法。该注解具有一个 value 属性&#xff0c;表示方法的标识。 import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java…

Cannot resolve property ‘driverClassName‘

已解决 Cannot resolve property 错误 最近在学习spring时遇到了下面的问题&#xff1a; spring读取不到property的name属性&#xff0c;报红&#xff0c;编译不通过&#xff0c;上网查到了两种解决方案&#xff0c;如下&#xff1a; 1、重新加载spring文件就可以解决问题了&a…

机器学习-基于attention机制来实现对Image Caption图像描述实验

机器学习-基于attention机制来实现对Image Caption图像描述实验 实验目的 基于attention机制来实现对Image Caption图像描述 实验内容 1.了解一下RNN的Encoder-Decoder结构 在最原始的RNN结构中&#xff0c;输入序列和输出序列必须是严格等长的。但在机器翻译等任务中&…

计算机毕业设计-----SSM宠物商城带后台管理系统

项目介绍 该项目为前后台项目&#xff0c;分为普通用户与管理员两种角色&#xff0c;前台普通用户登录&#xff0c;后台管理员登录&#xff1b; 用户角色包含以下功能&#xff1a; 加入购物车,发表留言,提交订单,查看订单信息,会员注册,登录页面等功能。 管理员角色包含以下…

python爬虫,简单的requests的get请求,百度搜索实例

1、百度搜索实例 import requests url = https://www.baidu.com/s? # key_word = 迪丽热巴 key_word = input(输入搜索内容:) headers = {User-Agent: Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/102.0.0.0 Safari/537.36 } …