Java多线程学习总结

在Java中,多线程编程是一种重要的编程模型,它允许程序同时执行多个任务,从而提高了程序的执行效率和响应速度。

一、基本概念

  1. 进程与线程:进程是系统分配资源的基本单位,它包含了程序执行所需的资源,如代码、数据、系统资源等。而线程是CPU调度的基本单位,它是进程中的一个执行单元,负责执行进程中的一段代码。一个进程可以包含多个线程,这些线程共享进程的资源。

  2. 并发与并行:并发是指多个任务在同一时间段内交替执行,而并行是指多个任务在同一时刻同时执行。在多核CPU的系统中,可以实现真正的并行执行,而在单核CPU的系统中,只能实现并发执行。

二、线程的三种创建方式

1.继承Thread类

通过继承Thread类并重写其run()方法,可以创建自定义的线程类。然后,创建该线程类的实例,并调用其start()方法即可启动线程。

优点

  • 代码简单明了,易于理解。
  • 可以直接调用Thread类中的方法,如start()run()interrupt()isInterrupted()等。

缺点

  • Java不支持多重继承,如果继承了Thread类,那么就不能再继承其他类。
  • 线程任务与代码耦合度高,不利于代码的复用和扩展。

 示例:

 

运行结果 

2.实现Runnable接口

​​​​​​​通过实现Runnable接口并重写其run()方法,也可以创建线程。这种方式更加灵活,因为Java不支持多继承,但可以实现多个接口。通常,我们会将线程的任务逻辑封装在一个实现了Runnable接口的类中,然后将其作为参数传递给Thread类的构造函数来创建线程。

优点

  • 避免了单继承的局限性,因为Java类可以实现多个接口。
  • 任务代码与线程代码分离,有利于代码的复用和扩展。
  • 可以通过共享Runnable实例来创建多个线程执行相同的任务。

缺点

  • 编写代码时稍微复杂一些,需要额外创建Thread对象。

 示例:

运行结果 

3.使用Callable与Future接口 

 创建一个实现Callable接口的类,这个类中的call()方法会包含线程要执行的代码。然后,你可以创建一个Thread对象,并将Callable对象包装在FutureTask中作为Thread的目标来执行。FutureTask实现了Future接口,允许你在主线程中等待Callable任务的完成并获取其结果。

优点

  • Callable接口可以返回执行结果,并且可以声明抛出异常。
  • 通过Future接口可以获取Callable执行结果的状态,并且可以获取执行的结果。

缺点

  • 相比Runnable接口,代码稍微复杂一些。

 示例:

开启一个线程,计算0到100的和,并将结果输出到控制台。

运行结果 

 三、线程的生命周期

线程的生命周期主要可以分为以下几个阶段:

  1. 新建状态:当线程对象被创建,但尚未调用其start()方法时,线程处于新建状态。此时,线程已经完成了初始化,但还没有开始执行。
  2. 就绪状态:当线程调用start()方法后,线程进入就绪状态。这意味着线程已经做好了运行准备,等待CPU的调度。
  3. 运行状态:当线程获得CPU时间片并开始执行时,线程进入运行状态。此时,线程正在执行其任务。
  4. 阻塞状态:线程因为某种原因(如等待I/O操作完成、等待获取锁等)暂时放弃CPU使用权,进入阻塞状态。阻塞状态是线程生命周期中的一个重要环节,它允许线程在必要时暂停执行,以便其他线程或系统资源可以得到使用。
  5. 等待状态:当线程需要等待某些条件满足时(如等待其他线程的通知或某个变量的值发生变化),线程会进入等待状态。
  6. 计时等待状态:这是等待状态的一种特殊情况,线程在等待时会设置一个超时时间。如果在超时时间内条件没有满足,线程会自动醒来并继续执行。
  7. 终止状态:当线程完成了任务或因为异常等原因退出时,线程进入终止状态。这标志着线程生命周期的结束。

四、线程同步与通信

多线程编程中,线程同步与通信是一个重要的问题。由于多个线程可能同时访问共享资源,如果没有适当的同步机制,就可能导致数据不一致或其他不可预测的问题。

Java提供了多种同步机制:

  1. synchronized关键字:可以用来修饰方法或代码块,确保同一时刻只有一个线程能够执行被修饰的代码。
     
  2. wait/notify/notifyAll方法:这些方法用于线程间的通信。wait()方法使当前线程等待,直到其他线程调用该对象的notify()或notifyAll()方法。notify()方法唤醒在此对象监视器上等待的单个线程,而notifyAll()方法则唤醒在此对象监视器上等待的所有线程。
     

  3. Lock接口:Java 5引入了Lock接口及其实现类,提供了比synchronized更灵活的锁机制。Lock接口的实现类包括ReentrantLock等。

 通过合理使用Java提供的同步和通信机制,可以编写出高效且稳定的多线程程序。

五、总结

Java多线程编程是一个强大而复杂的特性,它允许我们充分利用多核CPU的优势,提高程序的执行效率和响应速度。然而,多线程编程也带来了线程安全和并发控制等问题。需要深入理解和掌握Java多线程的相关概念和关键技术,才能编写出高效、稳定的多线程程序。

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

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

相关文章

Django第三方功能的使用

Django第三方功能的使用 Django REST framework前言1、Django--Restframework--coreapi版文档BUG:AssertionError: coreapi must be installed for schema support.How to run Django with Uvicorn webserver?2、序列化类 Serializer的使用模型序列化类 ModelSerializer的使用…

2024年阿里云优惠券领取攻略

阿里云作为国内领先的云计算服务提供商,以其稳定、高效、安全的服务赢得了众多用户的青睐。为了吸引用户上云,阿里云经常推出各种优惠活动,其中就包括阿里云优惠券。本文将为大家详细解读2024年阿里云优惠券的领券攻略,帮助大家轻…

DDR3的使用(非AXI4总线)

参考小梅哥视频:https://www.bilibili.com/video/BV1va411c7Dz/?p48&spm_id_frompageDriver&vd_sourceaedd69dc9740e91cdd85c0dfaf25304b 一、DDR3的MIG配置 找到MIG的IP核 AXI4 interface不用勾选 不需要兼容以下的FPGA就不用勾选 选择DDR3 1.1 三…

ARM v8 Cortex R52内核 04 时钟和复位 Clocking and Resets

ARM v8 Cortex R52内核 04 时钟和复位 Clocking and Resets 4.1 Clock and clock enables 时钟和时钟使能 Cortex-R52处理器具有一个单一的时钟,驱动着所有的触发器和RAM。各种输入,包括复位输入,都有同步逻辑使它们可以与处理器时钟异步操…

C语言—实现循序表的增删查改

一.正文 嗨嗨嗨!大家好!今天我为大家分享的是数据结构知识——顺序表。废话不多数,让我们开始今天的知识分享吧。 二.正文 1.1认识数据结构 数据结构是计算机存储、组织数据的方式。数据结构是指相互之间存在一种或多种特定关系的数据元素…

【学习】软件测试人员使用Loadrunner进行性能测试的优势

在软件测试领域,性能测试是一项至关重要的环节,它关乎到软件系统的稳定性和用户体验。而在这其中,Loadrunner作为一款久经考验的性能测试工具,凭借其独特的优势,成为了众多企业和开发者眼中的“得力助手”。 首先&…

踩了一堆坑,终于掌握了postgreSQL主从流的精髓

📢📢📢📣📣📣 哈喽!大家好,我是【IT邦德】,江湖人称jeames007,10余年DBA及大数据工作经验 一位上进心十足的【大数据领域博主】!😜&am…

spring-cloud-alibaba微服务Sentinel

Sentinel 官方网站 sentinel-dashboard-1.8.7.jar包下载地址 在window通过命令行启动(java -Dserver.port8080 -Dproject.namesentinel-dashboard -jar sentinel-dashboard-1.8.7.jar),可以通过 -Dserver.port修改控制台的端口 使用的版本最好…

探索ERC20代币:构建您的第一个去中心化应用

下面文章中会涉及到该资源中的代码,如果想要完整版代码可以私信我获取🌹 文章目录 概要整体架构流程技术名词解释ERC20智能合约web3.js 技术细节ERC20合约部署创建前端界面前端与智能合约互连运行DAPP 小结 概要 在加密货币世界中,ERC20代币…

地球上的七大洲介绍

地球上的七大洲示意图: 1. 亚洲(Asia):世界上最大的洲,面积约为44579000平方公里。亚洲地域辽阔,包括从北极圈到赤道的各种气候和地形。它拥有世界上最多的人口,也是世界上一些最古老文明的发源…

【Linux】账号和权限管理

目录 一、用户账号与组账号 二、添加用户账号-useradd 三、修改用户账号的属性-usermod 四、更改用户命令-passwd 五、删除用户账号-userdel 六、添加组账号-groupadd 七、添加删除组成员-gpasswd 八、删除组账号-groupdel 九、查询账号信息-groups、id、finger、w、w…

REINFORCE及进阶算法讲解笔记

REINFORCE 总结 估计VALUE-methods没有在理论上证明收敛,而policy-methods不需要估计value function。 本算法总结了过去的算法,将过去算法作为特例看待,证明了即使是结合函数估计和实际采样的value梯度都可以无偏估计,证明了某种…

Java基础(一)--语法入门

文章目录 第一章、语法入门一、Java简介1、JVM2、Java程序执行过程3、JDK4、JRE5、JDK、JRE和JVM三者关系 二、Java常量与变量1、标识符2、关键字3、保留字4、变量5、数据类型6、常量 三、运算符1、算术运算符2、赋值运算符3、关系运算符4、逻辑运算符5、条件运算符6、运算符的…

Spring5深入浅出篇:Spring自定义类型转换器

Spring5深入浅出篇:Spring自定义类型转换器 类型转换器 首先要知道什么叫做类型转换器 ,我们通过配置的属性值是以字符串的形式为什么在查看对象成员变量时已经变成了int,这就是Spring的内置类型转换器帮我们做了自动类型转换. 作⽤:Spring通过类型转换器把配置⽂件…

Leetcode二十三题:合并K个升序链表【22/1000 python】

“合并K个升序链表”,这是一道中等难度的题目,经常出现在编程面试中。以下是该问题的详细描述、解题步骤、不同算法的比较、代码示例及其分析。 问题描述 给你一个链表数组,每个链表都已经按升序排列。 请你将所有链表合并到一个升序链表中…

数据结构书后习题

p17 1&#xff0c; 个人解答&#xff1a; int DeleteMinElem(SqList &L,int &min) {int j 0;if (L.length 0){printf("error!");return 0;}int min L.data[0];for (int i 1; i < L.length; i){if (L.data[i] < min){min L.data[i];j i;}}L.dat…

软考127-上午题-【软件工程】-McCabe度量法

一、McCabe度量法 1-1、定义 McCabe 度量法是通过定义环路复杂度&#xff0c;建立程序复杂性的度量。 它基于一个程序模块的程序图中环路的个数。计算有向图G的环路复杂性的公式为&#xff1a; V(G) m - n 2 闭合区域 1 其中V(G)是有向图 G 中的环路个数&#xff0c;m 是…

【C语言__结构体__复习篇3】

目录 前言 一、结构体基础知识 1.1 结构体的语法形式 1.2 创建结构体变量 1.3 结构体变量的初始化 1.4 点(.)操作符和箭头(->)操作符 二、匿名结构体 三、结构体自引用 四、结构体内存对齐 4.1 内存对齐的规则 4.2 出现结构体内存对齐的原因 4.3 修改默认对齐数 五、结…

8:系统开发基础--8.1:软件工程概述、8.2:软件开发方法 、8.3:软件开发模型、8.4:系统分析

转上一节&#xff1a; http://t.csdnimg.cn/G7lfmhttp://t.csdnimg.cn/G7lfm 课程内容提要&#xff1a; 8&#xff1a;知识点考点详解 8.1&#xff1a;软件工程概述 1.软件的生存周期 2.软件过程改进—CMM Capability Maturity Model能力成熟度模型 3.软件过程改进—CMMI—…

Jmeter配置服务器监控插件

1.安装插件管理器 插件官网地址&#xff1a;JMeter Plugins :: JMeter-Plugins.org 点击 Plugins Manager,如上图所示&#xff0c; &#xff0c;点击jar file下载“plugins-manager.jar”&#xff0c;下载后放到“jmeter\lib\ext”目录下&#xff0c;重启jmeter。 2.安装资源…