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多线程的相关概念和关键技术,才能编写出高效、稳定的多线程程序。

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

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

相关文章

目标检测应用场景—数据集【NO.30】织物缺陷图像目标检测数据集

写在前面:数据集对应应用场景,不同的应用场景有不同的检测难点以及对应改进方法,本系列整理汇总领域内的数据集,方便大家下载数据集,若无法下载可关注后私信领取。关注免费领取整理好的数据集资料!今天分享…

GDPU Java 天码行空7

实验目的: 熟悉awt组件和三种基本布局,掌握按钮、文本框、标签、等基本控件的使用和事件响应编程。 熟悉布局管理器 1. 窗体关闭事件 💖 WindowCloseEvent.java import java.awt.event.WindowAdapter; // 导入WindowAdapter类,…

指针的深入理解(七)

指针的深入理解(七) 个人主页:大白的编程日记 个人专栏:C语言学习之路 感谢遇见,我们一起学习进步! 文章目录 指针的深入理解(七)前言一.常量字符串指针1.1常量字符串的理解1.2常量…

软考128-上午题-【软件工程】-白盒测试

一、白盒测试(结构测试) 白盒测试也称为结构测试,根据程序的内部结构和逻辑来设计测试用例,对程序的路径和过程进行测试,检查是否满足设计的需要。 白盒测试常用的技术是:逻辑覆盖、循环覆盖和基本路径测…

Qt控件---多元素类

文章目录 QListWidget(纵向列表)使用 QTableWidget(表格)使用 QTreeWidget(树形控件)QTreeWidgetItem使用 QListWidget(纵向列表) QListWidget里的每个元素都为 QListWidgetItem 类…

[计算机效率] 时间记录工具:ManicTime

3.24 时间记录工具:ManicTime ManicTime是一款数据收集软件,主要用于记录电脑上各种软件使用所花费的时间以及电脑闲置的时间。用户还可以定制记录某一时间段内的系统活动。 数据收集:ManicTime能够静默运行于后台,自动跟踪并收…

[MySQL]数据库原理8——喵喵期末不挂科

希望你开心,希望你健康,希望你幸福,希望你点赞! 最后的最后,关注喵,关注喵,关注喵,大大会看到更多有趣的博客哦!!! 喵喵喵,你对我真的…

解读《算者生存:商业分析的方法与实践》:构建企业经营分析框架的必备指南

💂 个人网站:【 摸鱼游戏】【神级代码资源网站】【工具大全】🤟 一站式轻松构建小程序、Web网站、移动应用:👉注册地址🤟 基于Web端打造的:👉轻量化工具创作平台💅 想寻找共同学习交…

【Qt 学习笔记】Qt常用控件 | 按钮类控件QPushButton的使用及说明

博客主页:Duck Bro 博客主页系列专栏:Qt 专栏关注博主,后期持续更新系列文章如果有错误感谢请大家批评指出,及时修改感谢大家点赞👍收藏⭐评论✍ Qt常用控件 | 按钮类控件QPushButton的使用及说明 文章编号&#xff1…

Linux数据库自动备份 - 定时任务发到百度云盘、坚果云、邮箱附件

前言 1. 坚果云的webdav云盘最好! (免费账号每月1G上传流量) 2. 不建议数据库备份文件发送到SMTP邮箱,因为对方服务器非常容易当做垃圾邮件处理,而且发信的SMTP账号会被封禁(实测163发到QQ邮箱被封&…

new Ammo.btSoftBodyHelpers() 是 Ammo.js 中的一个构造函数,用于创建软体物体的辅助对象,提供了一些方法来创建软体物体

demo案例 new Ammo.btSoftBodyHelpers() 是 Ammo.js 中的一个构造函数,用于创建软体物体的辅助对象,提供了一些方法来创建软体物体。以下是它的一些重要信息: 入参:通常不需要传入参数。 出参:创建的新的软体辅助对…

SENet模型原理及代码介绍

一.模型简介: SENet的全称叫Squeeze-and-Excitation Networks(挤压-激励网络,简称SENet),于2017年提出,并拿下了当年的ImageNet分类比赛的冠军。ResNet是2015年ImageNet的冠军,2016年ResNeXt&am…