Java第二十章

news2024/11/23 13:08:29

一.创建线程

1.继承Thread类

Thread类是java.lang 包中的一个类,从这个类中实例化的对象代表线程,程序员启动一个新线程需要建立Thread实例。Thread类中常用的两个构造方法如下:

public Thread()://创建一个新的线程对象。
public Thread(String threadName)://创建一个名称为threadName的线程对象

//继承Thread类创建一个新的线程的语法如下:
public class ThreadTest extends Thread{
}

 例1.

2.实现Runnable接口

到目前为止,线程都是通过扩展Thread 类来创建的,如果程序员需要继承其他类(非Thread类),而且还要使当前类实现多线程,那么可以通过 Runnable 接口来实现。例如,一个扩展JFrame类的GU程序不可能再继承Thread类,因为Java语言中不支持多继承,这时该类就需要实现Runmable接口使其具有使用线程的功能。实现Runnable接口的语法如下:

public class Thread extends Object implements Runnable

实现 Runnable 接口的程序会创建一个 Thread 对象,并将 Runnable 对象与 Thread 对象相关联,Thread类中有以下两个构造方法:

public Thread(Runnable target)

 public Thread(Runnable target,String name)

例2.

二.线程的生命周期 

        线程具有生命周期,其中包含 7 种状态,分别为出生状态、就绪状态、运行状态、等待状态、休眠状态、阻塞状态和死亡状态。出生状态就是线程被创建时处于的状态,在用户使用该线程实例调用start()方法之前线程都处于出生状态;当用户调用start()方法后,线程处于就绪状态(又被称为可执行状态);当线程得到系统资源后就进入运行状态。

        一旦线程进入可执行状态,它会在就绪与运行状态下转换,同时也有可能进入等待、休眠、阻塞或死亡状态。当处于运行状态下的线程调用 Thread 类中的 wait0方法时,该线程便进入等待状态,进入等待状态的线程必须调用Thread类中的notify()方法才能被唤醒,而调用otifyAll()方法可将所有于等待状态下的线程唤醒;当线程调用 Thread 类中的 sleep()方法时,则会进入休眠状态。如果一个线程在运行状态下发出输入/输出请求,该线程将进入阻塞状态,在其等待输入/输出结束时线程进入就绪状态,对于阻塞的线程来说,即使系统资源空闲,线程依然不能回到运行状态。当线程的 run()方法执行完毕时,线程进入死亡状态。

三.操作线程的方法

1.线程的休眠 

 一种能控制线程行为的方法是调用 sleep()方法,sleep()方法需要一个参数用于指定该线程休眠的时间,该时间以毫秒为单位。在前面的实例中,已经演示过 sleep()方法,它通常是在 run()方法内的循环中被使用。sleep()方法的语法如下:

try{
    Thread.sleep(2000);
}catch(InterruptedException e){
    e.printStackTrace();
}

例3.

2.线程的加入 

        如果当前某程序为多线程程序,假如存在一个线程A,现在需要插入线程 B,并要求线程B先执行完毕,然后再继续执行线程A,此时可以使用Thread类中的join()方法来完成。这就好比此时读者正在看电视,突然有人上门收水费,读者必须付完水费后才能继续看电视。
        当某个线程使用 join()方法加入另外一个线程时,另一个线程会等待该线程执行完毕后再继续执行。

例4.

3.线程的中断 

以往有的时候会使用 stop()方法停止线程,但当前版本的JDK 早已废除了 stop()方法,不建议使用stop()方法来停止一个线程的运行。现在提倡在run()方法中使用无限循环的形式,然后使用一个布尔型标记控制循环的停止。

例5.

4.线程的礼让 

Thread 类中提供了一种礼让方法,使用 yield()方法表示,它只是给当前正处于运行状态的线程一个提醒,告知它可以将资源礼让给其他线程,但这仅是一种暗示,没有任何一种机制保证当前线程会将资源礼让。

四.线程的优先级 

Thread 类中包含的成员变量代表了线程的某些优先级,如 Thread.MIN_PRIORITY(常数1)Thread.MAX_PRIORITY(常数10)、Thread.NORM_PRIORITY(常数5)。其中每个线程的优先级都在Thread.MIN_PRIORITY~Thread.MAX_PRIORITY,在默认情况下其优先级都是 Thread.NORM_PRIORITY。每个新产生的线程都继承了父线程的优先级。

例6.

五.线程同步 

1.线程安全 

        实际开发中,使用多线程程序的情况很多,如银行排号系统、火车站售票系统等。这种多线程的程序通常会发生问题,以火车站售票系统为例,在代码中判断当前票数是否大于 0,如果大于0则执行将该票出售给乘客的功能,但当两个线程同时访问这段代码时(假如这时只剩下一张票),第一个线程将票售出,与此同时第二个线程也已经执行完成判断是否有票的操作,并得出票数大于 0的结论,于是它也执行售出操作,这样就会产生负数。所以,在编写多线程程序时,应该考虑到线程安全问题.实质上线程安全问题来源于两个线程同时存取单一对象的数据。

2.线程同步机制 

同步块

Java 中提供了同步机制,可以有效地防止资源冲突。同步机制使用 synchronized 关键字,使用该关键字包含的代码块称为同步块,也称为临界区,语法如下:

synchronized (Object){
    }

 例7.

同步方法 

同步方法就是在方法前面用synchronized关键字修饰的方法,其语法如下:

synchronized void f(){}

 当某个对象调用了同步方法时,该对象上的其他同步方法必须等待该同步方法执行完毕后才能被执行。必须将每个能访问共享资源的方法修饰为synchronized,否则就会出错。

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

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

相关文章

王者荣耀游戏制作

1.创建所需要的包 2.创建怪物类 bear package beast;import wangzherogyao.GameFrame;public class Bear extends Beast {public Bear(int x, int y, GameFrame gameFrame) {super(x, y, gameFrame);setImg("img/bear.jpg");width 85;height 112;setDis(65);}} b…

倒计时 5 天,您有一份 2023 IoTDB 用户大会参会指南请注意查收!

叮叮!距离 2023 IoTDB 用户大会在北京与大家见面还有 5 天! 这场筹备已久的盛会,汇集了超 20 位大咖嘉宾带来的精彩议题,届时来自美国国家工程院、清华大学软件学院的产业大拿,与能源电力、钢铁冶炼、城轨运输、智能制…

如何使用ArcGIS Pro制作一张北极俯视地图

地图的表现形式有很多种,经常我们看到的地图是以大西洋为中心的地图,还有以太平洋为中心的地图,今天要给大家介绍的地图是从北极上方俯视看的地图,这里给大家讲解一下制作方法,希望能对你有所帮助。 修改坐标系 制作…

AntDB数据库:从海量数据处理,到5G计费商用核心

AntDB数据库自2008年研发面世以来,首先被应用于运营商的核心系统,满足运营商海量数据处理的需求。随着数字科技的不断发展,AntDB也在不断地更新迭代,逐渐地为更多行业与客户提供更全面的服务。5G时代来临,AntDB抓住发展…

webGL开发虚拟实验室

开发虚拟实验室是一个具有挑战性但也非常有趣和有价值的任务。通过 WebGL,你可以创建交互式、沉浸式的虚拟实验室,使用户能够进行实验和学习。以下是一些步骤和关键考虑因素,帮助你开始开发虚拟实验室,希望对大家有所帮助。北京木…

你知道显卡型号上的数字是什么意思吗?数字越大就越好吗?

大家好,欢迎来到我们的显卡探秘之旅!今天,我们将一探究竟——显卡型号上的数字到底是啥意思?是不是数字越大,显卡就越NB?别急,跟着小编一起揭开这个神秘的数字面纱! Q1 显卡的基本概…

技巧-PyCharm中Debug和Run对训练的影响和实验测试

简介 在训练深度学习模型时,使用PyCharm的Debug模式和Run模式对训练模型的耗时会有一些区别。 Debug模式:Debug模式在训练模型时,会对每一行代码进行监视,这使得CPU的利用率相对较高。由于需要逐步执行、断点调试、查看变量值等操…

链接共享平台LinkStack

什么是 LinkStack ? LinkStack 是一个独特的平台,为在线管理和共享链接提供了高效的解决方案。平台提供了一个类似于 Linktree 的网站,它可以让用户克服社交媒体平台上只能添加一个链接的限制。借助 LinkStack,用户可以轻松链接到…

无需提前更新数据源,一键形态选股直接出票——股票量化分析工具QTYX-V2.7.3...

功能概述 我们的股票量化系统QTYX在实战中不断迭代升级!!! 星球学员中的大佬们给QTYX提供了很多实战应用方面的建议,志同道合的一群人一起来优化完善这个系统,日益强大的QTYX同时也能更好地帮助各位在市场中提高战绩! 这个需求是来自于星球学…

“华为不造车 只帮车企造好车“ 那么华为到底造不造车

大家好,我是极智视界,欢迎关注我的公众号,获取我的更多前沿科技分享 邀您加入我的知识星球「极智视界」,星球内有超多好玩的项目实战源码和资源下载,链接:https://t.zsxq.com/0aiNxERDq "华为不造车&a…

W2311283-可燃气体监测仪怎么监测燃气管道

可燃气体监测仪怎么有效监测燃气管道 燃气管道遍布于城市地下各处,作为城市生命线的一部分,一旦燃气管网出现泄露问题便是牵一发而动全身,城市的整体安全也会受到威胁。但是如何才能科学管理和监测燃气管网呢? 燃气管网监测系统便…

Vue3-ElementPlus按需导入

1.安装 pnpm add element-plus 2.配置按需导入: 官方文档:快速开始 | Element Plus 按照官网按需导入中的自动导入步骤来进行 pnpm add -D unplugin-vue-components unplugin-auto-import 观察Vite代码与原vite文件的差别,将原vite文件中没…

实测有效的 8 个顶级Android 数据恢复工具

由于我们现在生活在一个依赖数字数据的时代,当重要文件从我们的 Android 手机中消失时,这将是一场数字噩梦。如果您没有预先备份Android手机上的数据或未能通过备份找到已删除的数据,那么选择最好的Android数据恢复软件是最佳选择。 因此&am…

Vue3中props传参(多种数据类型传参方式)

在Vue3中,props接收的type类型有以下几种: 1. String:字符串类型 2. Number:数字类型 3. Boolean:布尔类型 4. Array:数组类型 5. Object:对象类型 6. Date:日期类型 7. Func…

逻辑漏洞 暴力破解(DVWA靶场)与验证码安全 (pikachu靶场) 全网最详解包含代码审计

逻辑漏洞 暴力破解(DVWA靶场)与验证码安全 (pikachu靶场) 全网最详解包含代码审计 0x01 前言 在当今互联网的广袤世界中,各式交互平台层出不穷。每一个交互平台几乎都要求用户注册账号,而这些账号则成为我们在数字世界中的身份象征。账号的安全性变得至…

「Verilog学习笔记」非整数倍数据位宽转换8to12

专栏前言 本专栏的内容主要是记录本人学习Verilog过程中的一些知识点,刷题网站用的是牛客网 要实现8bit数据至12bit数据的位宽转换,必须要用寄存器将先到达的数据进行缓存。8bit数据至12bit数据,相当于1.5个输入数据拼接成一个输出数据&#…

【Redis6快速深入学习04】Redis字符串(String)的使用和原理

Redis字符串(String) 4.1 Redis 中 String 的简介 String 是Redis五种最基本的类型之一,在使用时可以理解成与Memcached一模一样的类型,一个key对应一个value。 String 类型是二进制安全的。意味着 Redis 的 string 可以包含任何数据。比如 jpg 图片或…

ReactDomServer 将react组件转化成html静态标签(SSR服务器渲染)

前言: 因为使用图表里面的formatter函数需要原生的html标签,但是本身技术栈是react,所以为了方便,便使用了ReactDomServer api将react组件转化成html原生标签引入: import ReactDomServer from react-dom/server; 使…

Linux编写Shell命令脚本

1.编写Shell脚本 可以将Shell终端解释器当作人与计算机硬件之间的“翻译官”,它作为用户与Linux系统内部的通信媒介,除了能够支持各种变量与参数外,还提供了诸如循环、分支等高级编程语言才有的控制结构特性。要想正确使用Shell中的这些功能…

Echarts大屏可视化_02 球体模块制作

继续跟着b站大佬pink老师学大屏可视化 球体模块制作 1.球体模块布局 HTML <div class"column"><div class"no"><div class"no-hd"><ul><li>125811</li><li>104563</li></ul></div&g…