Java语言程序设计——篇十七(1)

在这里插入图片描述
在这里插入图片描述

       🌿🌿🌿跟随博主脚步,从这里开始→博主主页🌿🌿🌿

  • 欢迎大家:这里是我的学习笔记、总结知识的地方,喜欢的话请三连,有问题可以私信🌳🌳🌳
    您的点赞👍、关注➕、收藏⭐️、评论📝、私信📧是我最大的支持与鼓舞!!!🌻🌻🌻

在这里插入图片描述

并发编程基础

  • 目录
    • Java多线程简介
      • 理解
        • 生活实例
  • 创建任务和线程
    • 实现多线程方式
      • 实现Runnable接口创建多线程
      • 继承Thread类创建多线程
        • 两种实现多线程方式的对比分析

目录

1️⃣Java多线程简介
2️⃣ 创建任务和线程
3️⃣ 线程的状态与调度
4️⃣ 线程同步与对象锁
5️⃣线程协调

Java多线程简介

  • 人们在日常生活中,很多事情都是可以同时进行的。例如,一个人可以一边听音乐,一边打扫房间。在计算机上,如果打开QQ音乐应用程序,可以一边听音乐,一边下载音乐。计算机这种能够在单个程序内同时完成多项任务的技术, 就是多线程。
  • 多任务是指在一个操作系统中可以同时运行多个应用程序,即有多个独立运行的任务,每一个任务对应一个进程。
  • Java支持多线程的语言之一,它内置了对多线程技术的支持,可以同时执行多个程序片段。
  • 在多任务操作系统中,表面上看是支持进程并行执行的,例如可以一边听音乐一边聊天。
  • 但**实际上这些进程并不是同时运行的。操作系统会为每一个进程分配一段有限的CPU使用时间,**CPU在这段时间中执行某个进程,然后会在下一段时间切换到另一个进程中去执行。
  • 由于CPU运行速度很快,能在极短的时间内在不同的进程之间进行切换,所以给人以同时执行多个程序的感觉。

理解

  • ①什么是进程?
  • 在操作系统中,每个独立执行的程序都可称之为一个进程。也就是“正在运行的程序”。
    在这里插入图片描述
    ②什么是线程
  • 每个运行的程序都是一个进程,在一个进程中还可以有多个执行单元同时运行,这些执行单元可以看作程序执行的一条条线索,被称为线程。
  • 线程运行需要的资源通常少于进程,因此一般将线程称为轻量级进程。
  • 操作系统中的每一个进程中都至少存在一个线程。例如当一个Java程序启动时,就会产生一个进程,该进程中会默认创建一个线程,在这个线程上会运行main()方法中的代码。
  • 在前面章节所接触过的程序中,代码都是按照调用顺序依次往下执行,没有出现两段程序代码交替运行的效果,这样的程序称作单线程程序。
  • 如果希望程序中实现多段程序交替运行的效果,则需要创建多个线程,即**多线程程序。**多线程是指一个进程在执行过程中可以产生多个单线程,这些单线程程序在运行时是相互独立的,它们可以并发执行。
  • 多线程程序的执行过程如图所示:
    在这里插入图片描述
  • 图中所示的多条线程,看似是同时执行的,其实不然,它们和进程一样,也是由CPU轮流执行的,只不过CPU运行速度很快,故而给人同时执行的感觉。
生活实例

①很多应用程序是用多线程实现的,如服务器编程就要用到多线程。比如,Tomcat服务器内部采用的就是多线程。
②在我们的应用开发中,也经常需要编写多线程的程序,如银行账户的取款、存款管理,售票窗口的管理,尤其在网络编程中更是经常使用多线程技术。

创建任务和线程

  • 为了创建新线程,应该首先定义该线程要执行的任务。一般来说,为了定义线程的任务,需要定义一个实现java.lang.Runnable接口的任务类。
  • Runnable接口只定义了一个方法,格式为:
        public abstract void run()
  • 线程要执行的任务就写在run()方法中, Runnable对象称为任务对象。
  • Thread类是线程类,该类的一个实例就是一个线程。
  • Thread类实现了Runnable接口。因此,线程对象就可以作为任务对象。
  • 一般,如果在main()方法中创建线程时没有指定任务对象,那任务对象就是当前线程对象。线程启动后就会执行该类的run()方法。

实现多线程方式

①实现java.lang.Runnable接口,并实现Runnable接口内的run()方法,完成线程运行的代码;
②继承java.lang包下的Thread类,重写Thread类的run()方法,在run()方法中实现线程运行的代码。

实现Runnable接口创建多线程

  • 定义一个类实现Runnable接口,然后将该类对象作为线程的任务对象。
  • 实现Runnable接口就是实现run()方法。
  • 案例:使用Runnable接口实现多线程来打印数字
    假设我们有两个任务,每个任务都需要打印一系列的数字。我们将通过实现Runnable接口来创建两个线程,每个线程负责打印一个数字序列。
  • 步骤 1: 创建实现Runnable接口的类
public class NumberPrinter implements Runnable {  private int start;  private int end;  public NumberPrinter(int start, int end) {  this.start = start;  this.end = end;  }  @Override  public void run() {  for (int i = start; i <= end; i++) {  System.out.println(Thread.currentThread().getName() + " prints " + i);  try {  // 为了演示效果,让线程稍微暂停一下  Thread.sleep(100);  } catch (InterruptedException e) {  Thread.currentThread().interrupt();  }  }  }  
}
  • 步骤 2: 创建线程并启动它们
public class RunnableDemo {  public static void main(String[] args) {  // 创建两个NumberPrinter实例,分别代表两个任务  Runnable task1 = new NumberPrinter(1, 5);  Runnable task2 = new NumberPrinter(6, 10);  // 创建Thread对象,将Runnable实例作为构造器参数  Thread thread1 = new Thread(task1, "Thread-1");  Thread thread2 = new Thread(task2, "Thread-2");  // 启动线程  thread1.start();  thread2.start();  }  
}

继承Thread类创建多线程

案例:使用继承Thread类的方式实现多线程来打印数字
假设我们有两个任务,每个任务都需要打印一系列的数字。我们将通过继承Thread类来创建两个线程类,每个类都重写run方法以执行打印任务。

  • 步骤 1: 创建继承自Thread的类
public class NumberPrinterThread extends Thread {  private int start;  private int end;  public NumberPrinterThread(String name, int start, int end) {  super(name); // 调用父类的构造器来设置线程名称  this.start = start;  this.end = end;  }  @Override  public void run() {  for (int i = start; i <= end; i++) {  System.out.println(Thread.currentThread().getName() + " prints " + i);  try {  // 为了演示效果,让线程稍微暂停一下  Thread.sleep(100);  } catch (InterruptedException e) {  Thread.currentThread().interrupt();  }  }  }  
}
  • 步骤 2: 创建线程实例并启动它们
public class ThreadDemo {  public static void main(String[] args) {  // 创建两个NumberPrinterThread实例,分别代表两个任务  Thread thread1 = new NumberPrinterThread("Thread-1", 1, 5);  Thread thread2 = new NumberPrinterThread("Thread-2", 6, 10);  // 启动线程  thread1.start();  thread2.start();  }  
}
两种实现多线程方式的对比分析
  • 第一种方法实现Runnable接口的缺点是编程稍微复杂一点,但这种方法可以扩展其他的类,更符合面向对象的设计思想。
  • 第二种方法的继承Thread类的优点是比较简单,缺点是如果一个类已经继承了某个类,它就不能再继承Thread类(因为Java语言只支持单继承)。
  • 事实上,大部分的多线程应用都会采用第一种方式,即实现Runnable接口。
    博主用心写,读者点关注,互动传真情,知识不迷路。

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

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

相关文章

探索人工智能的未来:埃里克·施密特2024斯坦福大学分享六

代理与文本生成模型的未来展望 您认为明年代理或文本生成模型会出现通货膨胀点吗&#xff1f; 不&#xff0c;不会。 我听到了类似的观点&#xff0c;尤其是埃里克科维茨的看法。他有一个很好的方式来阐述这三个趋势。虽然我之前也听说过这些趋势&#xff0c;但将它们整合起…

helm安装jenkins保姆级别

一、创建nfs服务器 这一步跳过、自行百度 注意&#xff1a;要给共享目录赋予权限chmod一下&#xff0c;不然到时候容器没办法在目录里面创建文件&#xff0c;初始化时候会报错误代码2 二、添加Jenkins的Helm仓库 helm repo add jenkinsci https://charts.jenkins.io helm re…

python dash框架 油气田可视化软件设计文档

V1.1:机器学习框架(神经网络) 时间范围优化 表格布局优化 添加前端设计元素布局 V1.0&#xff1a;基础布局和对应计算函数 要求 首先第一部分是通过神经网络预测天然气流量&#xff0c;其中输入开始时间和截止时间是为了显示这一段时间内的天然气流量预测结果 第二部分&…

前端宝典十三:node网络详解Tcp/IP/Http及网络安全防御

讨论网络相关的问题前&#xff0c;我们首先看一下从浏览器输入 URL 到显示前端页面的流程&#xff0c;首先从TCP的应用层、传输层、网络层、数据链路层开始看&#xff1a; 一、应用层、传输层、网络层、数据链路层 以下是从浏览器输入 URL 到显示前端页面的流程顺序解析&…

通过IDEA创建spring boot的web项目

1.Fle->New->Project,选择Maven&#xff0c;点击Next 2.修改项目名称&#xff0c;点击Finish 3.项目创建完毕&#xff0c;等待Maven下载完成 4.修改pom.xml文件&#xff0c;改成如下内容 <?xml version"1.0" encoding"UTF-8"?> <pr…

R 语言学习教程,从入门到精通,R 绘图饼图(22)

1、R 绘图 饼图 R 语言提供来大量的库来实现绘图功能。 饼图&#xff0c;或称饼状图&#xff0c;是一个划分为几个扇形的圆形统计图表&#xff0c;用于描述量、频率或百分比之间的相对关系。 R 语言使用 pie() 函数来实现饼图&#xff0c;语法格式如下&#xff1a; pie(x, la…

基于无人机边沿相关 ------- IBUS、SBUS协议和PPM信号

文章目录 一、IBUS协议二、SBUS协议三、PPM信号 一、IBUS协议 IBUS&#xff08;Intelligent Bus&#xff09;是一种用于电子设备之间通信的协议&#xff0c;采用串行通信方式&#xff0c;允许多设备通过单一数据线通信&#xff0c;较低延迟&#xff0c;支持多主机和从机结构&a…

EchoMimic原文翻译+代码调试+不同模型对比

文章目录 EchoMimic原文翻译EchoMimic:逼真的音频驱动肖像动画通过可编辑的landmark条件Abstract1. Introduction2. Related Works2.1. 扩散模型2.2.肖像动画:从视频到基于图像的方法 3. Method3.1. Preliminaries3.2. Model Architecture3.3. Training Details3.4. Inference …

线性预测与深度学习基础(Datawhale X 李宏毅苹果书 AI夏令营)

在这篇文章中&#xff0c;我们通过预测视频平台次日的观看次数的案例&#xff0c;来探讨线性预测模型和深度学习模型的基本概念及应用方法。 线性模型的构建与优化 我们首先使用线性回归模型来预测未来的观看次数。线性回归模型假设目标变量&#xff08;观看次数&#xff09;与…

HarmonyOS应用四之页面加载构建以及数据请求

目录&#xff1a; 1、加载网络页面/本地页面/html页面2、页面布局3、HTTP/HTTPS的数据请求4、上传图片并保存数据 1、加载网络页面/本地页面/html页面 // xxx.ets import { webview } from kit.ArkWeb; import { BusinessError } from kit.BasicServicesKit;Entry Component s…

BaseCTF [第一周]UPX 迷你

笔记。 脱壳。 ida打开 tab转&#xff01; BaseCTF{Hav3__g0od_t1m3!!!}

Facebook与区块链:社交网络如何融入去中心化技术

随着区块链技术的飞速发展&#xff0c;去中心化理念逐渐渗透到各个领域&#xff0c;社交网络也不例外。作为全球领先的社交平台&#xff0c;Facebook在这一趋势下开始积极探索区块链技术的潜力&#xff0c;希望利用这一前沿技术来提升平台的安全性、透明度和用户控制权。本文将…

什么是红黑树-面试中常问的数据结构

你有没有想过,为什么你的 Java HashMap 能够如此高效地处理数百万个键值对?或者你的 Linux 系统是如何在眨眼间就能管理成千上万的进程的?这些看似神奇的性能背后,隐藏着一个优雅而强大的数据结构 - 红黑树。 目录 什么是红黑树?红黑树的特性为什么需要红黑树?红黑树的结…

浅谈Kafka(二)

浅谈Kafka&#xff08;二&#xff09; 文章目录 浅谈Kafka&#xff08;二&#xff09;Kafka架构图Kafka生产者幂等性与事务生产者分区写入策略乱序问题消费者组的Reblance机制消费者分区分配策略副本机制分区的leader与followerAR/ISR/OSRcontroller介绍与选举Leader负载均衡Ka…

CSDN AI-WEB-1.0 攻略

找到一个目标靶场的IP &#xff0c; 这里以172.16.1.98 为例 1、使用命令 /robots.txt 来确定目录 2、分别测试两个文件 均无法访问&#xff0c;可返回其根目录查询 3、到根目录&#xff0c;出现搜索框 4、输入ID为1 5、使用虚拟机kali的终端 搜索命令 dirsearch -u http:…

【Dash】feffery_antd_components 简单入门示例

一、简单了解 feffery_antd_components 简称 fac &#xff0c;是一个基于 Ant Design 的 Dash 第三方组件&#xff0c;由Feffery 老师开源维护的 Python 网页开发组件库&#xff0c;它具有丰富的页面常用交互组件功能&#xff0c;使开发者可以使用纯Python的方式快速构建现代…

asp.net Core blazor学习笔记

最近在研究学习blazor&#xff0c;为了加深记忆&#xff0c;手动记录一下&#xff0c;以下内容为个人理解记录&#xff0c;仅供参考&#xff1a; Blazor开发学习 一 分类1 Blazor Server 应用2 Blazor WebAssembly 应用3 Blazor Hybrid 应用和 .NET MAUI 二 基础知识1 路由2 组…

算法的学习笔记—二叉树中和为某一值的路径

&#x1f600;前言 在二叉树中寻找和为某一特定值的路径问题是一个经典的面试题&#xff0c;考察了对二叉树的遍历能力以及递归和回溯算法的理解和应用。本文将详细解析这一问题&#xff0c;并提供一个Java实现。 &#x1f3e0;个人主页&#xff1a;尘觉主页 文章目录 &#x1…

使用Node-RED实现和部署物联网入侵检测的机器学习管道

整理自 《Implementing and Deploying an ML Pipeline for IoT Intrusion Detection with Node-RED》&#xff0c;由 Yimin Zhang 等人撰写&#xff0c;发表于 2023 年 CPS-IoT Week Workshops。以下是根据提供的 PDF 内容整理的论文的详细主要内容&#xff1a; 摘要 (Abstra…

0基础深度学习项目13:基于TensorFolw实现天气识别

&#x1f368; 本文为&#x1f517;365天深度学习训练营 中的学习记录博客&#x1f356; 原作者&#xff1a;K同学啊 目录 一、创建环境二、前期准备2.1 设置GPU2.2 导入数据2.3 数据预处理2.3.1 加载数据2.3.2 查看图像的标签 2.4 数据可视化 三、构建简单的CNN网络&#xff0…