并发编程(四)

线程:数组形成的栈,方法的调用,出栈入栈

1、线程和进程的区别

  1. 资源占用:进程是拥有资源的基本单位,不同进程之间不可以共享资源。线程不占有资源,但一个进程内的所有线程可以共享进程内的资源。
  2. 并发性:进程之间可以并发执行。一个进程内的多个线程也可以并发执行。
  3. 系统开销:创建和销毁进程的时候,系统要分配和回收资源。所以进程的系统开销大于线程。
  4. 执行过程:线程不能独立执行,必须依存在应用程序中,由应用程序提供多个线程执行控制。每个独立的进程有一个程序运行的入口、顺序执行序列和程序入口。一个进程崩溃后,在保护模式下不会对其他进程产生影响,但是一个线程崩溃整个进程都死掉。所以多进程要比多线程健壮。

2、创建线程的方法

  1. 创建一个子类,继承Thread类,重写run方法,在主线程中创建子类对象,然后调用start方法,启动线程。
  2. 创建一个实现类实现Runnable接口,实现run方法,然后再主线程中创建实现类对象,然后把这个对象作为Thread类的参数,创建一个Thread对象,然后调用start方法启动线程。
  3. 创建一个实现类实现Callable接口,实现call方法。 再主线程中创建实现类对象,然后把这个对象作为Thread的参数,创建一个Thread对象,调用start方法启动线程。
  4. 利用线程池创建线程。例如可以使用newSingleThreadExecutor、newCachedThreadPool或newScheduledThreadPool等方式创建线程。

Java代码对线程优先级设置不管用

3、wait()和sleep()的区别

都是立刻让出CPU,sleep不会释放锁锁,wait会释放锁,wait需要事先持有锁

4、如何查看线程信息

在Java中,可以使用以下方法来查看线程信息:

使用Thread类的静态方法currentThread()来获取当前执行的线程对象。然后,可以使用该线程对象的实例方法getId()来获取线程的唯一标识符,getName()来获取线程的名称。

Thread currentThread = Thread.currentThread();

long threadId = currentThread.getId();

String threadName = currentThread.getName();

使用jps命令来查看Java进程的线程信息。打开命令行,进入到jdk的bin目录下,执行jps命令,可以看到当前Java线程的进程ID和名字。然后,使用jstack命令结合进程ID来打印出线程的信息。

jps

jstack <process id>

使用JConsole工具。在jdk的bin目录下有一个JConsole工具,打开它并连接到Java进程,可以在图形界面中查看线程信息。

使用VisualVM工具。VisualVM是一个功能强大的Java性能分析工具,可以查看Java进程的线程信息,包括线程的堆栈跟踪、CPU使用情况等。

使用Java的并发包(java.util.concurrent)。Java提供了一些并发工具类和接口,如ExecutorService、Future、CountDownLatch等,可以帮助开发者更好地管理和控制线程。

5、如何控制线程的执行顺序:

1、通过join控制

2、通过wait notify

3、通过共享变量

6、ThreadLocal:在线程内只能看到自己的变量,看不到其它线程的

ThreadLocal 是 Java 中一个非常有用的类,它提供了线程局部变量。这些变量与普通的变量的区别在于,每个线程都拥有该变量的独立实例,互不干扰。这样,每个线程都可以修改自己的变量副本,而不会影响其他线程的副本。

使用 ThreadLocal 可以解决多线程中的数据同步问题,每个线程都拥有自己的数据副本,避免了对共享数据的并发访问冲突。

实现原理:每个线程调用都会拷贝一份对其进行操作;虚引用

7、CountDownLatch 控制多个线程同时开始

CountDownLatch 是 Java 并发库中的一个类,它允许一个或多个线程等待其他线程完成操作。它提供了一种简单的方法来同步线程的执行。

CountDownLatch 的工作原理是,它维护一个计数器(count),初始化为一个特定的值。每个线程在完成自己的工作后,会调用 countDown() 方法来递减计数器。当计数器递减到 0 时,所有在 await() 方法上等待的线程都会被唤醒并继续执行。

8、线程池:管理线程

它预先创建了若干数量的线程,并且不能由用户直接对线程的创建进行控制,在这个前提下重复使用固定或较为固定数目的线程来完成任务的执行。这样做的好处是,一方面,消除了频繁创建和消亡线程的系统资源开销,另一方面,面对过量任务的提交能够平缓的劣化。

public interface ThreadPool<Job extends Runnable> {
// 执行一个Job,这个Job需要实现Runnablevoid execute(Job job);
// 关闭线程池void shutdown();
// 增加工作者线程void addWorkers(int num);
// 减少工作者线程void removeWorker(int num);
// 得到正在等待执行的任务数量int getJobSize();
}

9、java中线程池的几种提交方式

  1. execute()方法:该方法用于提交一个Runnable任务。当线程池中的线程数量小于corePoolSize时,会直接创建一个新的线程来执行任务;当线程数量大于等于corePoolSize时,会将任务放入队列中等待执行。无返回值
  2. submit()方法:该方法用于提交一个Runnable任务或者一个返回Future的对象。它与execute()方法的主要区别在于,submit()方法返回一个Future对象,可以通过该对象获取任务的执行结果或者取消任务。当线程池中的线程数量小于corePoolSize时,会直接创建一个新的线程来执行任务;当线程数量大于等于corePoolSize时,会将任务放入队列中等待执行。

有任务就会先交给核心线程数处理,核心线程数满了就会将线程放入队列中,加快线程的消耗

开启最大线程数的情况下,队列还是满的,就会采用拒绝策略

没有任务的核心线程也会处于运行状态;核心线程执行完成后处于空闲状态,没有满的话,后面的线程会新建一个执行,这样能提高运行速度

在finally块中释放锁,目的是保证在获取到锁之后,最终能够被释放;锁资源如果不被释放,会导致死锁的问题,解决办法:

Lock lock = new ReentrantLock();
lock.lock();
try {
} finally {lock.unlock();
}

java中finally的作用

无论是否发生异常,都必须要执行的代码块。finally代码块通常用于资源的清理工作,比如关闭文件、释放网络连接等。

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

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

相关文章

Linux反向、分离解析与主从复制

前言 上篇介绍了DNS正向解析&#xff0c;本文将继续介绍反向解析与主从复制等内容。域名反向解析即从IP地址到域名的映射。为了完成逆向域名解析&#xff0c;系统提供一个特别域&#xff0c;该特别域称为逆向解析域。 目录 前言 一、反向解析 1. 配置bind服务 2. 修改区…

leetcode - 926. Flip String to Monotone Increasing

Description A binary string is monotone increasing if it consists of some number of 0’s (possibly none), followed by some number of 1’s (also possibly none). You are given a binary string s. You can flip s[i] changing it from 0 to 1 or from 1 to 0. Re…

Redis的设计、实现

数据结构和内部编码 type命令实际返回的就是当前键的数据结构类型,它们分别是:string(字符串)hash(哈希)、list(列表)、set(集合)、zset (有序集合),但这些只是Redis对外的数据结构。 实际上每种数据结构都有自己底层的内部编码实现,而且是多种实现,这样Redis会在合适的…

MVC设计模式

在当今的软件开发领域&#xff0c;MVC&#xff08;Model-View-Controller&#xff09;设计模式已经成为了一种广泛使用的架构模式。它为应用程序提供了一种结构化的方法&#xff0c;将数据、用户界面和业务逻辑分开&#xff0c;从而使得应用程序更易于维护、扩展和重用。 一、…

十四.变量、异常处理

变量、异常处理 1.变量1.1系统变量1.1.1系统变量分类1.1.2查看系统变量 1.2用户变量1.2.1用户变量分类1.2.2会话用户变量1.2.3局部变量1.2.4对比会话用户变量与局部变量 2.定义条件与处理程序2.1案例分析2.2定义条件2.3定义处理程序2.4案例解决 1.变量 在MySQL数据库的存储过程…

算法33:返回组成aim的最少货币张数 ----- 从左往右尝试模型

之前对从左到右尝试模型的累加和进行过总结了&#xff0c;概括为&#xff1a; 1. 针对固定集合&#xff0c;值不同&#xff0c;就是讨论要和不要的累加和。算法30有完整的例子 2. 针对非固定集合&#xff0c;面值固定&#xff0c;张数无限。口诀就是讨论要与不要&#xff0c;…

STM32H5培训(一)总览

文章目录 1. 前言2. STM32H5系列MCU的特点和新功能包括性能提升、新外设和安全功能等3. STM32H5系列型号之间的区别和关键资源对比4. 性能和功能亮点6. 开发生态参考&#xff1a; 1. 前言 本篇主要介绍STM32H5系列MCU的特点和新功能&#xff0c;包括全新的M33内核、250M主频处…

软件测试|selenium 元素无此属性NoSuchAttributeException问题分析与解决

简介 在使用Selenium进行Web自动化测试时&#xff0c;我们可能会遇到NoSuchAttributeException异常。这个异常通常在尝试访问一个元素的属性&#xff08;attribute&#xff09;时抛出&#xff0c;但该属性不存在。本文将介绍NoSuchAttributeException异常的常见原因以及解决方…

Vue-15、Vue条件渲染

1、v-show 在Vue中&#xff0c;v-show是一个指令&#xff0c;用于根据表达式的值来控制元素的显示与隐藏。当指令的值为true时&#xff0c;元素显示&#xff1b;当指令的值为false时&#xff0c;元素隐藏。 v-show的用法如下&#xff1a; <!DOCTYPE html> <html lan…

基于stm32f103c8t6连接阿里云上传信息

很抱歉,作为一个AI助手,我无法提供一篇基于STM32F103C8T6连接阿里云上传信息的完整博客文章。但我可以为您提供一个大概的步骤概述和一些关键点,帮助您构思或撰写这样的博客: 标题:利用STM32F103C8T6单片机实现与阿里云IoT平台的数据传输 --- **引言** 简述STM32微控制…

代码随想录二刷 |二叉树 | 二叉搜索树的最小绝对差

代码随想录二刷 &#xff5c;二叉树 &#xff5c; 二叉搜索树的最小绝对差 题目描述解题思路 & 代码实现递归法迭代法 题目描述 530.二叉搜索树的最小绝对差 给你一棵所有节点为非负值的二叉搜索树&#xff0c;请你计算树中任意两节点的差的绝对值的最小值。 示例&#…

从0开始python学习-47.pytest框架之解决Template替换无法进行二次处理的问题之热加载

问题&#xff1a;当参数为动态参数时&#xff0c;Template替换无法进行二次处理 解决方案&#xff1a;通过热加载来进行替换 热加载原理&#xff1a;在代码运行的过程中动态的调用python中的方法达到获得动态参数 可以进行热加载的情况&#xff1a;yaml文件&#xff0c;随机…

用我这套模板,几分钟做出文档网站!

大家好&#xff0c;我是保姆皮&#xff0c;最近我上线了自己的《编程宝典》网站&#xff0c;可以在线阅读我分享过的各种编程学习路线和知识干货。 指路&#xff1a;https://codefather.cn/ 不少小伙伴催我出教程&#xff0c;说也想做个类似的文档网站。 所以我用最快的速度出了…

程序员如何写高水平简历?(附模板)

Q&#xff1a;什么是高水平的简历&#xff1f; A&#xff1a;满足HR需求的同时&#xff0c;最大化的体现自身价值的简历是高水平的简历 HR的需求是什么&#xff1f; ✅ HR想看到清晰专业的简历模板 ——家人们每天看几百份简历谁懂啊&#xff01;花里胡哨真看不下去一点&…

OpenAI 自带的检索功能好用吗?定量测评带你深度了解!

向量数据库的劲敌来了&#xff1f;又有一批赛道创业公司要倒下&#xff1f; …… 这是 OpenAI 上线 Assistant 检索功能后&#xff0c;技术圈传出的部分声音。原因在于&#xff0c;此功能可以为用户提供基于知识库问答的 RAG&#xff08;检索增强生成&#xff09; 能力。而此前…

深入理解 MyBatis-Plus 批量保存方法

前言 在项目开发中&#xff0c;需要插入批量插入20多万条数据&#xff0c;通过日志观察&#xff0c;发现在调用MyBatis-Plus中的saveBatch()方法性能非常的差&#xff0c;本篇文章主要分享一下saveBatch()的原理以及使用的注意事项 原理 我们通过源码的形式进行解析saveBatc…

生信步骤|Orthofinder寻找直系同源基因

在探究功能基因的时候&#xff0c;我们经常需要对所研究的基因/蛋白质进行聚类分组&#xff0c;逐个类群探究蛋白功能。创建同源群可以采用Otrhofinder软件&#xff0c;该软件安装方便&#xff0c;运行快速&#xff0c;调用简单&#xff0c;可以说是构建同源群的神器。从OrthoF…

逆变器简述

一般家用电器&#xff0c;像微波炉&#xff0c;电饭煲等都是直接插墙壁上的电就可以工作&#xff0c;所以这些家用电器是使用我们市电AC220V的电压 但我们用到的手机&#xff0c;电瓶车以及新能源汽车都是需要充电器的&#xff0c;所以这些用电产品里面都是有电池的&#xff0…

统计学-R语言-4.1

文章目录 前言编写R函数图形的控制和布局par函数layout函数 练习 前言 安装完R软件之后就可以对其进行代码的编写了。 编写R函数 如果对数据分析有些特殊需要&#xff0c;已有的R包或函数不能满足&#xff0c;可以在R中编写自己的函数。函数的定义格式如下所示&#xff1a; …

在微服务架构中认证和授权的那些事儿

在微服务架构中认证和授权是最基础的服务能力&#xff0c;其中这一块行业类的标准就是OAuth2 和 SSO &#xff0c;而OAuth2 和 SSO 可以归类为“用户管理和身份验证”工具&#xff0c;OpenID Connect 1.0是 OAuth 2.0 协议之上的一个简单身份层。 Part.1 认识OAuth 2.0 OAuth…