java 并发编程 (1)java中如何实现并发编程

目录

1. 继承 Thread 类

2. 实现 Runnable 接口         

3. 使用 FutureTask

4. 使用 Executor 框架

5. 具体案例


1. 继承 Thread

概述:通过继承 Thread 类并重写其 run() 方法来创建一个新的线程。

步骤

  • 创建一个继承 Thread 类的子类。
  • 重写 run() 方法,定义线程执行的任务。
  • 调用 start() 方法来启动线程。

优缺点

  • 优点:实现简单,直接继承 Thread 类即可。
  • 缺点:由于 Java 不支持多继承,如果已经继承了其他类,则不能再继承 Thread 类。

2. 实现 Runnable 接口         

概述:通过实现 Runnable 接口并重写其 run() 方法来定义线程的任务,再通过 Thread 类来启动线程。

步骤

  • 创建一个实现 Runnable 接口的类。
  • 重写 run() 方法,定义线程执行的任务。
  • 使用 Thread 类来启动线程并传递 Runnable 对象。

优缺点

  • 优点:相比于继承 Thread,实现 Runnable 可以避免继承的限制,可以实现多线程任务的复用。
  • 缺点:需要显式地将 Runnable 对象传递给 Thread,稍微多了一些步骤。

3. 使用 FutureTask

概述FutureTask 是一个用于表示异步计算结果的类,可以结合 RunnableCallable 来创建并管理多线程任务。它实现了 Runnable 接口,因此可以用于线程的启动,并可以获取任务的执行结果。

步骤

  • 创建一个实现 Callable 接口的任务类(如果需要返回值)。
  • 使用 FutureTask 包装该任务。
  • 使用 ThreadExecutorService 来执行 FutureTask

优缺点

  • 优点:可以返回结果并处理异常,适用于需要获取计算结果的任务。
  • 缺点:相较于 Runnable,稍微复杂一些,适用于复杂任务或异步计算。

4. 使用 Executor 框架

概述Executor 框架提供了一种更高层次的线程池管理方式。它通过 ExecutorService 接口来管理线程池中的线程,实现任务的提交、调度、管理等。

步骤

  • 创建一个线程池,例如通过 Executors.newFixedThreadPool() 创建一个固定大小的线程池。
  • 提交任务到线程池,任务可以是实现了 RunnableCallable 的任务。
  • 通过 ExecutorServicesubmit()execute() 方法来提交任务。

优缺点

  • 优点:线程池管理线程,减少了创建和销毁线程的开销,能够控制最大线程数,适用于大量任务的执行。
  • 缺点:需要更多的配置和理解,适合中大型项目中的多线程任务管理。

5. 具体案例

package com.lirui.springbootmoduledemo.controller;import java.util.concurrent.*;public class test {public static void main(String[] args) throws InterruptedException {long startTime = System.currentTimeMillis(); // 记录开始时间// 创建任务 1Thread task1 = new Thread(new Runnable() {@Overridepublic void run() {System.out.println("Task 1 started.");try {Thread.sleep(2000);  // 模拟任务执行2秒} catch (InterruptedException e) {e.printStackTrace();}System.out.println("Task 1 finished.");}});// 创建任务 2Thread task2 = new Thread(new Runnable() {@Overridepublic void run() {System.out.println("Task 2 started.");try {Thread.sleep(1000);  // 模拟任务执行1秒} catch (InterruptedException e) {e.printStackTrace();}System.out.println("Task 2 finished.");}});// 创建任务 3Thread task3 = new Thread(new Runnable() {@Overridepublic void run() {System.out.println("Task 3 started.");try {Thread.sleep(1500);  // 模拟任务执行1.5秒} catch (InterruptedException e) {e.printStackTrace();}System.out.println("Task 3 finished.");}});// 启动任务task1.start();task2.start();task3.start();// 等待所有线程执行完毕task1.join();task2.join();task3.join();long endTime = System.currentTimeMillis(); // 记录结束时间System.out.println("All tasks finished.");System.out.println("Total time taken: " + (endTime - startTime) + " milliseconds");}public static void main(String[] args) throws InterruptedException {long startTime = System.currentTimeMillis(); // 记录开始时间// 执行任务 1System.out.println("Task 1 started.");Thread.sleep(2000);  // 模拟任务执行2秒System.out.println("Task 1 finished.");// 执行任务 2System.out.println("Task 2 started.");Thread.sleep(1000);  // 模拟任务执行1秒System.out.println("Task 2 finished.");// 执行任务 3System.out.println("Task 3 started.");Thread.sleep(1500);  // 模拟任务执行1.5秒System.out.println("Task 3 finished.");long endTime = System.currentTimeMillis(); // 记录结束时间System.out.println("All tasks finished.");System.out.println("Total time taken: " + (endTime - startTime) + " milliseconds");}
}

        从上面的案例中可以明显看出,并发执行和顺序执行在速度上的差距。具体来说,在 单线程 执行的情况下,任务是按顺序依次执行的,每个任务必须等待前一个任务完成后才能开始,因此总的执行时间是所有任务执行时间的累加。而在 多线程 执行的情况下,任务是并行执行的,多个任务可以同时进行,特别是在多核处理器上,线程可以在不同的 CPU 核心上并行运行,这大大缩短了总的执行时间。通过这种方式,任务 1、2 和 3 的执行时间是重叠的,最终的执行时间仅取决于最长的任务。因此,在并发执行的情况下,程序的总执行时间显著减少,相比顺序执行,性能提升尤为明显,尤其当任务之间的执行时间差异较大时,效果更加突出。

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

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

相关文章

巧用观测云可用性监测(云拨测)

前言 做为系统运维或者开发,很多时候我们需要能够实时感知我们所运维的系统和服务的情况,比如以下的场景: 系统上线前测试:包括功能完整性检查,确保页面元素(如图像、视频、脚本等)都能够正常…

python oa服务器巡检报告脚本的重构和修改(适应数盾OTP)有空再去改

Two-Step Vertification required: Please enter the mobile app OTPverification code: 01.因为巡检的服务器要双因子认证登录,也就是登录堡垒机时还要输入验证码。这对我的巡检查服务器的工作带来了不便。它的机制是每一次登录,算一次会话…

Unreal从入门到精通之如何绘制用于VR的3DUI交互的手柄射线

文章目录 前言实现方式MenuLaser实现步骤1.Laser和Cursor2.移植函数3.启动逻辑4.检测射线和UI的碰撞5.激活手柄射线6.更新手柄射线位置7.隐藏手柄射线8.添加手柄的Trigger监听完整节点如下:效果图前言 之前我写过一篇文章《Unreal5从入门到精通之如何在VR中使用3DUI》,其中讲…

Win11 22H2/23H2系统11月可选更新KB5046732发布!

系统之家11月22日报道,微软针对Win11 22H2/23H2版本推送了2024年11月最新可选更新补丁KB5046732,更新后,系统版本号升至22621.4541和22631.4541。本次更新后系统托盘能够显示缩短的日期和时间,文件资源管理器窗口很小时搜索框被切…

【数据结构】【线性表】【练习】反转链表

申明 该题源自力扣题库19&#xff0c;文章内容&#xff08;代码&#xff0c;图表等&#xff09;均原创&#xff0c;侵删&#xff01; 题目 给你单链表的头指针head以及两个整数left和right&#xff0c;其中left<right&#xff0c;请你反转从位置left到right的链表节点&…

【赵渝强老师】MySQL的慢查询日志

MySQL的慢查询日志可以把超过参数long_query_time时间的所有SQL语句记录进来&#xff0c;帮助DBA人员优化所有有问题的SQL语句。通过mysqldumpslow工具可以查看慢查询日志。 视频讲解如下&#xff1a; MySQL的慢查询日志 【赵渝强老师】MySQL的慢查询日志 下面通过具体的演示…

基于docker进行任意项目灵活发布

引言 不管是java还是python程序等&#xff0c;使用docker发布的优势有以下几点&#xff1a; 易于维护。直接docker命令进行管理&#xff0c;如docker stop、docker start等&#xff0c;快速方便无需各种进程查询关闭。环境隔离。项目代码任何依赖或设置都可以基本独立&#x…

Android 分区相关介绍

目录 一、MTK平台 1、MTK平台分区表配置 2、MTK平台刷机配置表 3、MTK平台分区表配置不生效 4、Super分区的研究 1&#xff09;Super partition layout 2&#xff09;Block device table 二、高通平台 三、展锐平台 四、相关案例 1、Super分区不够导致编译报错 经验…

数据库类型介绍

1. 关系型数据库&#xff08;Relational Database, RDBMS&#xff09;&#xff1a; • 定义&#xff1a;基于关系模型&#xff08;即表格&#xff09;存储数据&#xff0c;数据之间通过外键等关系相互关联。 • 特点&#xff1a;支持复杂的SQL查询&#xff0c;数据一致性和完整…

当产业经济插上“数字羽翼”,魔珐有言AIGC“3D视频创作大赛”成功举办

随着AI技术的飞速发展&#xff0c;3D数字人技术已成为驱动各行各业转型升级的重要力量。在这一背景下&#xff0c;2024山东3D数字人视频创作大赛应运而生&#xff0c;并在一番激烈的角逐后圆满落幕&#xff0c;为科技与创意的交融写下浓墨重彩的一笔。 11月20日&#xff0c;一…

经济增长初步

1.人均产出 人均产出&#xff0c;通常指的是一个国家、地区或组织在一定时期内&#xff0c;每个劳动人口平均创造的生产总值。它是衡量一个地区或国家经济效率和劳动生产率的重要指标。具体来说&#xff0c;人均产出可以通过以下公式计算&#xff1a; 人均产出总产出/劳动人口…

图像增强夜视仪行业全面而深入的分析

图像增强夜视设备&#xff08;I2ND 或 INVD&#xff09;是一种增强监视、安全和军事应用的微光可见度的技术。 它允许用户在非常弱的光线甚至完全黑暗的条件下看到东西。 一、市场研究 1. 市场规模与增长趋势 据QYResearch调研团队最新报告&#xff0c;预计2029年全球图像增强…

002 MATLAB语言基础

01 变量命名规则 变量名只能由字母、数字和下划线组成&#xff0c;且必须以字母开头&#xff1b; 变量名区分字母的大小写&#xff1b; 变量名不能超过最大长度限制&#xff1b; 关键字不能作为变量名&#xff0c;如for、end和if等&#xff1b; 注意&#xff1a;存变量命名时…

greater<>() 、less<>()及运算符 < 重载在排序和堆中的使用

简略图 greater<>()(a, b) a > b 返回true&#xff0c;反之返回false less<>()(a, b) a < b 返回true&#xff0c;反之返回false 在cmp中使用&#xff08;正着理解&#xff09; 规则返回true时a在前&#xff0c;反之b在前 在priority_queue中使用 &#xff…

冲破AI 浪潮冲击下的 迷茫与焦虑

在这个科技日新月异的时代&#xff0c;人工智能如汹涌浪潮般席卷而来&#xff0c;不断改变我们的生活。你是否对 AI 充满好奇&#xff0c;却不知它将如何改变你的工作与生活&#xff1f;又是否会在 AI 浪潮的冲击下陷入迷茫与焦虑&#xff1f;《AI 时代&#xff1a;弯道超车新思…

嵌入式LVGL自定义纯数字键盘

嵌入式LVGL自定义纯数字键盘 一、前言二、设置自定义数字键盘三、使用一、前言 嵌入式UI项目中有时候会使用到纯数字密码的需求,所以打算使用LVGL构建自定义的纯数字键盘。 二、设置自定义数字键盘 参考这个文章,以LV_KEYBOARD_MODE_USER_1为例,增加一个数字键盘,如下图所…

第6篇 寻找最大数___ARM C语言程序<二>

Q&#xff1a;如何创建基于ARM处理器的C语言程序寻找一组数据列表中的最大数呢&#xff1f; A&#xff1a;和基于Nios II处理器的C语言程序一样&#xff0c;在ARM处理器C语言中也使用printf库函数显示程序的运行结果&#xff0c;若要调用printf函数&#xff0c;必须在C程序中包…

【11.22更新】Win11 24H2正式版:26100.2454镜像一键获取!

今日&#xff0c;系统之家小编就给大家带来2024年11月最新推出的Windows11 24H2正式版系统&#xff0c;该版本系统包含最新可选更新补丁KB5046740&#xff0c;用户安装后版本号升至26100.2454。更新此系统后&#xff0c;用户就能通过文件资源管理器和桌面上的右键菜单将内容分享…

python小课堂(一)

基础语法 1 常量和表达式2 变量和类型2.1 变量是什么2.2 变量语法 3 变量的类型3.1 动态类型特性 4 注释4.1注释是什么 5 输入输出5.1 print的介绍5.2 input 6 运算符6.1 算术运算符在这里插入图片描述6.2 关系运算符6.3 逻辑运算符6.4赋值运算符 1 常量和表达式 在print()中可…

区块链网络示意图;Aura共识和Grandpa共识(BFT共识)

目录 区块链网络示意图 Aura共识和Grandpa共识(BFT共识) Aura共识 Grandpa共识(BFT共识) Aura与Grandpa的结合 区块链网络示意图 CP Blockchain:这是中央处理区块链(或可能指某种特定的处理单元区块链)的缩写。它可能代表了该区块链网络的主要处理或存储单元。在这…