【Java】多线程编程(实验十)

目录

一、实验目的

二、实验内容

三、实验小结


一、实验目的

1、 了解线程的调度和执行过程,掌握Java 语言中多线程编程的基本方法

2、 掌握Runnable 接口实现多线程的方法

3、 掌握Thread 类实 现多线程的用法

二、实验内容

采用多线程机制模拟汇款业务。定义一银行类可接受顾客的汇款,其属性count用于存储账户金额。现有两名顾客,每人分三次、每次100元将钱汇入count。每进行一次汇款,便输出汇款人和账户总额。

算法描述及实验步骤:

①首先定义一个银行类并实现Runnable接口的run()方法,作为两个顾客线程的目标对象用于顾客存钱的银行。

②在银行类中创建一个count实例变量用于存放顾客汇款总钱数。

③在银行类中实现run()方法并使用循环的机制来模拟每人三次汇款的情况,然后使用println()方法输出每次顾客汇款的情况。

④在主类中创建两个顾客线程并将银行类的实例作为其两个线程去银行存钱的目标对象。

⑤使用setName()方法为两个顾客线程起名字。

⑥最后,使用start()方法启动两个顾客线程模拟去银行汇款。

源代码:

 实验运行截图:

 

三、实验小结

1、编写好的未运行的代码就是程序,一但编写好的代码程序被运行起来就是进程。线程被包含在进程之中,依附于进程是进程处理多任务的其中一个任务分支,线程只要被开启,便不在依附于产生它的父线程,自己会经历从产生、运行、中断到死亡的过程。

2、多线程就是一个程序中包含多个线程,用于分别处理不同的任务。线程一旦被开启,便会进入就绪队列排队等候Java虚拟机轮询反复将计算机CUP的使用权切换给队列中的其中一个线程。线程一旦获得CUP的使用权便会自动执行自身的run()方法中编写的任务。一旦分配给正在运行的线程CUP时间用完,不管此线程方法中的任务代码是否执行完毕,Java虚拟机都会自动将CUP的使用权切换给下个排队等候的线程去执行其代码。

3、每个线程都有自身的生命周期和状态。如:

  • 新建状态NEW:Thread类获其子类一旦创建线程对象,此时的线程便是新建状态,新建状态位于线程被创建到开启线程之前。
  • 可运行状态RUNNABLE:线程对象一旦调用start()方法便会进入就绪队列排队等候CUP的使用权,此时的线程也会从新建状态切换到可运行状态。
  • 中断状态(BLOCKED、WAITING、TIMED_WAING):

    BLOCKED: 正在使用CUP运行的线程一旦被Java虚拟机将cup的使用权切换给其他的线程,此线程便会从可运行状态切换到阻塞状态,直到Java虚拟机再次将cup的使用权切换给此进程,状态才会变回可运行状态。

    WATING:正在使用cup执行方法的线程,一旦在其执行代码期间调用wait()方法,此线程便会中止执行并将cup的使用权让给其他的线程,除非其他的线程调用notifyAll()方法,等待中止运行的线程才能恢复到可运行状态重新等待使用cup执行代码。

    TIMED_WAING: 正在使用cup执行的线程一旦调用Thread.sleep()方法,便会进入休眠状态。在非同步方法线程中,此时线程将中止运行并让出cup的使用权给其他的线程;若是在同步方法中,此线程虽然也会中止运行但并不会让出cup的使用权,休眠时间结束此线程便会接着运行。

  • 死亡状态TERMINATED:线程的任务方法一旦执行完毕或者返回,便会进入死亡状态,表明此线程需要处理的任务执行完毕不在排队使用CUP资源。

4、进入就绪队列排队等候使用cup的线程都会有优先级,其范围1~10越大越优,默认线程的优先级为5。处于高优先级的线程将先使用cup的资源,同等优先级的线程则排队等待轮流使用cup的资源,直到其优先级的线程都执行完毕或返回,低优先级的线程才使用cup的资源。setPriority(int grade)方法设置线程的优先级,getPriority()返回线程的优先级。

5、线程的创建有两种方法,其中:

  • 使用Thread类的子类创建线程。子类中必须重写Thread线程类中的run()方法来指定子类创建的线程要执行的任务代码。
  • 使用Thread(Runnable target)类直接创建线程。必须是实现Runnable接口的类的对象才能作为线程的目标参数即目标对象。创建的线程会与目标对象绑定,一旦线程获取到cpu的使用权便会自动调用目标对象中的run()方法执行线程的任务。其中有两种方式:①声明创建的线程不是目标对象类中的成员变量②声明创建的线程是目标对象所在类中的成员变量。可以使用“线程.setName(String name)”方法给线程起名字,使用”Thread.currentThread().getName()”方法获取目前使用cup的线程名。
  • 一个线程对应一个run()方法,即使线程都指向同一个目标对象也是如此。

6、线程常用方法如下:

  • start()开启线程。使线程从新建状态进入可运行状态(就绪队列)排队等候使用cpu资源
  • run()定义线程对象被调用之后执行的操作任务。Thread的子类创建的线程必须重写Thread父类中的run()方法。
  • sleep(毫秒)线程调用此方法会放弃cpu的使用权中止运行,进行休眠状态,待到时间结束或被其他线程吵醒则休眠结束再次排队等候cpu的使用权。休眠期间cpu的使用权会不会被其他线程使用要看sleep()方法使用的场景。
  • isAlive() 判断线程是否处于就绪队列排队使用cpu资源即存活阶段。线程未启动或处于死亡状态都返回false。
  • currentThread()获取当前正在使用cpu资源的线程对象。
  • interrupt()休眠的线程对象调用此方法会吵醒休眠的线程让其触发interruptedException异常,从而结束休眠,排队等候使用cpu。

7、线程同步就是多个线程都使用同一个用synchronized修饰的同步方法。一个线程只有执行完同步方法或返回后其他的线程才能使用此同步方法。即同步方法在某个线程使用期间不允许其他的线程调用即使当前线程处于休眠状态也不会让出cpu的使用权,除非同步方法执行完毕,当前线程结束。有点类似文件锁。

8、在同步方法中正在运行的线程可以调用wait()方法来中止本线程的执行,让出cpu的使用权,使本线程处于等待状态,在此期间允许其他的线程使用同步方法;待其他线程执行完同步方法后并使用notifyAll()方法通知处于等待的线程结束等待后,其他等待中断的线程才能重新从中断处继续执行(遵循:先中断先继续原则)。

9、一个正在执行的线程可以让其他线程调用join()方法来与本线程联合。当前线程一旦和其他线程联合,本线程将中止运行直到联合的线程执行完毕或返回后,本线程才会排队等候cpu使用权接着运行。

10、在GUI图形编程中,程序一旦执行便会自动产生许多线程,其中AWT-EventQuecue线程负责处理组件触发的事件即执行监视器对象调用其事件处理的方法。AWT-Windows线程负责将窗体或组件绘制到桌面。组件一旦触发事件,Java虚拟机便会立刻将cpu的使用权切换给AWT-EventQuecue线程(其他线程将被中断执行),让其去执行处理事件的方法。

11、用户可以使用javax.swing.Timer(int a, Object b)方法创建计时器对象。其中a表示计时器每隔a毫秒便会“振铃”一次即触发一次actionEvent动作事件,b表示计时器对象注册绑定的监视器对象(注:监视器对象必须是组件类如JFrame、JButton等的子类的实例,否则计时器无法启动)用来处理动作事件。计时器对象调用setReapeats(Boolean b)方法并将参数设置为false后可以将计时器只振铃一次。setInitalDelay(int depay)设置计时器首次触发动作事件的延时,否则延时为a。

12、守护线程:只要其他所有的用户线程(非守护)都执行完毕结束运行后,不管守护线程中的run()方法任务是否执行完毕都会立刻结束运行,简记:”你们(用户线程)都不活了,我(守护线程)也不活了!”。一个线程只有必须在开启之前使用setDaemon(true)方法设置自身是否为守护线程。默认所有的线程都是非守护线程。

@声明:“山月润无声”博主知识水平有限,以上文章如有不妥之处,欢迎广大IT爱好者指正,小弟定当虚心受教!

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

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

相关文章

C++中的STL数据结构

内容来自:代码随想录:哈希表理论基础 1.常见的三种哈希结构 当我们想使用哈希法来解决问题的时候,我们一般会选择如下三种数据结构 数组 set (集合) map(映射) 在C中,set 和 map 分别提供以下三种数据结构…

数据结构-列表LinkedList

一,链表的简单的认识. 数组,栈,队列是线性数据结构,但都算不上是动态数据结构,底层都是依托静态数组,但是链表是确实真正意义上的动态数组. 为什么要学习链表? 1,链表时最简单的动态数据结构 2,掌握链表有助于学习更复杂的数据结构,例如,二叉树,trie. 3,学习链表有助于更深入…

【SpringCloudAlibaba系列--nacos配置中心】

Nacos做注册中心以及使用docker部署nacos集群的博客在这: 容器化部署Nacos:从环境准备到启动 容器化nacos部署并实现服务发现(gradle) 使用docker部署nacos分布式集群 下面介绍如何使用nacos做配置中心 首先要进行nacos-config的引入,引入…

【QT QML】软件打包,生成安装包

一、版本 Desktop 5.15.2 MinGW 64-bit二、打包 1. 编译Release版本 2. 在工程目录下找到Realse文件夹 3. 拷贝文件 ***-Desktop_Qt_5_15_2_MinGW_64_bit-Release - release - xxx.exe到一个新文件夹中 4. 开启相应打包工具(根据自己的编译器和版本选择&#xff0…

【C++】类与对象—— 初始化列表 、static 静态成员、

类与对象 1 再谈构造函数1.1 构造函数体赋值1.2 初始化列表语法:建议:初始化顺序:注意: 1.3 explicit关键字 2 static 静态成员2.1 概念2.2 声明成员变量2.3 使用类的静态成员2.4 定义静态成员总结 Thanks♪(・ω&#…

深入了解Kettle工具:数据集成与转换的利器

深入了解Kettle工具:数据集成与转换的利器 在当今数据驱动的时代,企业需要处理大量来自不同来源的数据,并将其整合到统一的数据仓库或数据湖中,以便进行进一步的分析和挖掘。而在这个过程中,数据集成与转换工具扮演着…

Android BitmapDrawable.bitmap与BitmapFactory.decodeResource获取不到原始图像素级真实宽高,Kotlin

Android BitmapDrawable.bitmap与BitmapFactory.decodeResource获取不到原始图像素级真实宽高,Kotlin 当一个图片放在ImageView里面后,用以下方式获取图的宽高: val bmp1 (this.drawable as BitmapDrawable).bitmapLog.d("fly", &…

直流恒流源电路

简介 使用电流源稳压器芯片搭建,该恒流源输出电流Iout1OuA*R2/R1,该电路可用于电阻阻值检测等相关场合。 注意:支持最大电流为200mA LT3092IST#PBF 简介 原理图展示

如何查看电脑使用记录?保障个人隐私和安全

查看电脑使用记录是了解电脑活动的一种重要方式,可以帮助用户追踪应用程序的使用情况、登录和关机时间、文件的访问记录等。在本文中,我们将介绍如何查看电脑使用记录的三个方法,以分步骤详细说明如何查看电脑使用记录,帮助用户更…

128 Linux 系统编程6 ,C++程序在linux 上的调试,GDB调试

今天来整理 GDB 调试。 在windows 上我们使用vs2017开发,可以手动的加断点,debug。 那么在linux上怎么加断点,debug呢?这就是今天要整理的GDB调试工具了。 那么有些同学可能会想到:我们在windows上开发,…

UML---活动图

活动图概述 活动图(Activity Diagram)是UML(Unified Modeling Language,统一建模语言)中的一种行为建模工具,主要用于描述系统或业务流程中的一系列活动或操作。活动图通常用于描述用例中的行为&#xff0c…

opengl pyqt 显示文字

目录 效果图 效果图 import sys from PyQt5.QtWidgets import QApplication, QMainWindow, QOpenGLWidgetfrom OpenGL.GL import * from OpenGL.GLUT import * from OpenGL.GLU import *class OpenGLWidget(QOpenGLWidget):def __init__(self, parentNone):super(OpenGLWidget…

开源分子对接程序rDock的安装及使用流程

欢迎浏览我的CSND博客! Blockbuater_drug …点击进入 前言 本文介绍开源分子对接程序rDock在Linux Ubuntu 22.04系统上的conda安装、编译安装过程及程序使用流程。 一、rDock是什么? rDock来源 rDock是一个快速、多功能的开源对接程序,可用…

IOS不使用默认的mainStroryboard作为首个controller的方法

步骤1: 删除info.plist文件下的一条配置,如图 步骤2: 编辑AppDelegate.m,参考以下代码 interface AppDelegate () //property (strong, nonatomic) UIWindow * window; property(nonatomic,strong) UIWindow * win; property(…

【Ubuntu】使用WSL安装Ubuntu

WSL 适用于 Linux 的 Windows 子系统 (WSL) 是 Windows 的一项功能,可用于在 Windows 计算机上运行 Linux 环境,而无需单独的虚拟机或双引导。 WSL 旨在为希望同时使用 Windows 和 Linux 的开发人员提供无缝高效的体验。安装 Linux 发行版时&#xff0c…

K8s安全一

Kubernetes是一个开源的,用于编排云平台中多个主机上的容器化的应用,目标是让部署容器化的应用能简单并且高效的使用, 提供了应用部署,规划,更新,维护的一种机制。其核心的特点就是能够自主的管理容器来保证云平台中的…

医院信息系统(HIS):一文扫盲,算是所有信息系统里面复杂的

大家好,我是贝格前端工场,本期继续分享常见的B端管理系统,欢迎大家关注,如有B端写系统界面的设计和前端需求,可以联络我们。 一、什么是HIS系统 HIS系统(Hospital Information System)是医院信…

K线实战分析系列之三:吞没形态

K线实战分析系列之三:吞没形态 一、吞没形态二、看涨吞没形态三、看跌吞没形态四、吞没形态判别标准 一、吞没形态 两根或两根以上的K线形成的组合形态,吞没形态就是一种主要的反转形态。 这个形态由两根K线组成,前短后长,一阴一…

第三百六十五回

文章目录 1. 概念介绍2. 方法与信息2.1 获取方法2.2 详细信息 3. 示例代码4. 内容总结 我们在上一章回中介绍了"如何获取设备信息"相关的内容,本章回中将介绍如何获取App自身的信息.闲话休提,让我们一起Talk Flutter吧。 1. 概念介绍 我们在本…

LeetCode LCR 085.括号生成

正整数 n 代表生成括号的对数,请设计一个函数,用于能够生成所有可能的并且 有效的 括号组合。 示例 1: 输入:n 3 输出:[“((()))”,“(()())”,“(())()”,“()(())”,“()()()”] 示例 2: 输入&#x…