java第20章节

一.线程简介

二.创建线程 

        1.继承Thread类

Thread类中常用的两个构造方法如下:

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

 继承Thread类创建一个新的线程的语法如下:

public class ThreadTest extends Thread{
}
【例20.1】让线程循环打印1~10的数字

代码:

结果: 

2.实现Runnable接口

实现Runnable接口的语法如下:

public class Thread extends Object implements Runnable

Thread类中有以下两个构造方法

public Thread(Runnable target)
public Thread(Runnable target,String name)

这两个构造方法的参数中都存在Runnable实例,使用以上构造方法就可以将Runnable实例与Thread实例相关联。

使用Runnable接口启动新的线程的步骤如下:

(1)建立Runnable对象。
(2)使用参数为Runnable对象的构造方法创建Thread实例。
(3)调用start()方法启动线程。
【例20.2】让窗口中的图标动起来

代码:

结果:

三.线程的生命周期

 要使线程处于就绪状态,有以下几种方法:

(1)调用sleep()方法。
(2)调用wait()方法。
(3)等待输入/输出完成。

 当线程处于就绪状态后,可以用以下几种方法使线程再次进入运行状态

(1)线程调用notify()方法。
(2)线程调用notifyAll()方法。
(3)线程调用interrupt()方法。
(4)线程的休眠时间结束。
(5)输入/输出结束。

四.操作线程的方法

        1.线程的休眠

sleep()方法的语法如下:

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

【例20.3】每0.1秒绘制一条随机颜色的线条

代码:

结果:

        2.线程的加入

如果当前某程序为多线程程序,假如存在一个线程A,现在需要插入线程B,并要求线程B先执行完毕,然后再继续执行线程A,此时可以使用Thread类中的join()方法来完成。

【例20.4】让进度条A等待进度条B

代码:

 

结果:

 

 3.线程的中断
如果线程是因为使用了sleep()或wait()方法进入了就绪状态,可以使用Thread类中interrupt()方法使线程离开run()方法,同时结束线程,但程序会抛出InterruptedException异常,用户可以在处理该异常时完成线程的中断业务处理,如终止while循环。

【例20.5】单击按钮停止进度条滚动
代码:

 

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

五.线程的优先级
线程的优先级可以使用setPriority()方法调整,如果使用该方法设置的优先级不在1~10,将产生IllegalArgumentException异常。

【例20.6】观察不同优先级的线程执行完毕顺序
代码:

结果: 

六.线程同步

        1.线程安全

例,在项目中创建ThreadSafeTest类,该类实现了Runnable接口,在未考虑到线程安全问题的基础上,模拟火车站售票系统的功能代码

代码:

 

结果:

2.线程同步机制

                1.同步块

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

 

synchronized(Object){
 
}
【例20.7】开发线程安全的火车售票系统

代码:

 

结果:

  2.同步方法

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

 

synchronized void f(){}

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

修改例20.7的代码,将共享资源操作放置在一个同步方法中,代码如下:

结果:

 

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Vue拖拽div移动位置

<div id"TestDiv" mousedown"OnMouseDown"></div> css #TestDiv { position: absolute;left: 50%;top: 50%;width: 100px;height: 100px;z-index: 999;background-color: red; } 处理函数 const OnMouseDown(e:any)> {let videoBox:any…

游戏缺少d3dx9_43.dll修复方法分享,快速解决dll缺失问题

在计算机使用过程中&#xff0c;我们常常会遇到一些错误提示&#xff0c;其中之一就是“找不到d3dx9_43.dll文件”。这个错误通常出现在运行某些游戏或应用程序时&#xff0c;d3dx9_43.dll是一个动态链接库文件&#xff0c;它是DirectX 9的一部分&#xff0c;用于支持游戏中的3…

建筑行业有哪些好用的项目管理软件或者OA系统?

建筑行业有哪些好用的项目管理软件或者OA系统&#xff1f; 在现代社会中&#xff0c;系统已经成为了企业人事信息化、项目管理等方面必不可少的工具。尤其是对于建筑行业的工程项目管理和人事OA而言&#xff0c;借助系统进行协同、计划、控制等方面的工作&#xff0c;已经成为…

新手小白必看!一文带你了解跨境电商独立站

对于很多新手跨境电商来说&#xff0c;或许你对亚马逊、ebay、速卖通这些跨境电商平台已经有所了解&#xff0c;那你知道跨境电商独立站吗&#xff1f;应该也有不少朋友对跨境电商独立站感兴趣&#xff0c;特别是现在各大跨境电商平台越来越卷&#xff0c;很多跨境卖家都开始通…

手把手教你通过CODESYS V3进行PLC编程(三)

教程背景 通过之前的教程&#xff0c;我们已经为大家演示了宏集MC-Prime控制器的连接、试运行和CODESYS的安装&#xff0c;并创建了一个计数器项目。在本期教程中&#xff0c;我们将进一步深入&#xff0c;教大家如何使用CODESYS的可视化界面。 一、两种可视化方式 在CODESYS…

代码混淆的原理和方法详解

代码混淆的原理和方法详解摘要移动App的广泛使用带来了安全隐患&#xff0c;为了保护个人信息和数据安全&#xff0c;开发人员通常会采用代码混淆技术。本文将详细介绍代码混淆的原理和方法&#xff0c;并探讨其在移动应用开发中的重要性。 引言随着移动应用的普及&#xff0c;…

C语言数组的距离(ZZULIOJ1200:数组的距离)

题目描述 已知元素从小到大排列的两个数组x[]和y[]&#xff0c; 请写出一个程序算出两个数组彼此之间差的绝对值中最小的一个&#xff0c;这叫做数组的距离 。 输入&#xff1a;第一行为两个整数m, n(1≤m, n≤1000)&#xff0c;分别代表数组f[], g[]的长度。第二行有m个元素&a…

无人机覆盖路径规划综述

摘要&#xff1a;覆盖路径规划包括找到覆盖某个目标区域的每个点的路线。近年来&#xff0c;无人机已被应用于涉及地形覆盖的多个应用领域&#xff0c;如监视、智能农业、摄影测量、灾害管理、民事安全和野火跟踪等。本文旨在探索和分析文献中与覆盖路径规划问题中使用的不同方…

JavaScript 的初步学习下篇

函数 语法格式 创建函数/函数声明/函数定义 function 函数名(形参列表) {函数体return 返回值; }函数调用 函数名(实参列表) // 不考虑返回值 返回值 函数名(实参列表) // 考虑返回值 注: 函数定义并不会执行函数体内容, 必须要调用才会执行. 调用几次就会执行几次. js 中…

【华为数通HCIP | 网络工程师】821刷题日记-BFD和VRRP 及重点(1)

个人名片&#xff1a; &#x1f43c;作者简介&#xff1a;一名大三在校生&#xff0c;喜欢AI编程&#x1f38b; &#x1f43b;‍❄️个人主页&#x1f947;&#xff1a;落798. &#x1f43c;个人WeChat&#xff1a;hmmwx53 &#x1f54a;️系列专栏&#xff1a;&#x1f5bc;️…

Java 基础学习(四)操作数组、软件开发管理

1 操作数组 1.1.1 System.arraycopy 方法用于数组复制 当需要将一个数组的元素复制到另一个数组中时&#xff0c;可以使用System.arraycopy方法。它提供了一种高效的方式来复制数组的内容&#xff0c;避免了逐个元素赋值的繁琐过程。相对于使用循环逐个元素赋值的方式&#x…

使用Wordpress 从0-1 制作一个博客网站

一. 做网站准备 购买域名 域名使用的是二级域名&#xff1a;blog.zmrw.net&#xff08;在浏览器可以提前预览网站制作后效果&#xff09; 购买服务器 服务器使用A2 Hosting 购买Wordpress 主题 主题使用的是 Porto 主题 二. 开始建站 1. 将域名添加至 Cloudflare 2. 将…

井盖倾斜监测方式,智能井盖传感器效果

大家是否都曾经想过&#xff0c;为什么路面上的井盖容易发生事故&#xff1f;其实这主要是因为井盖倾斜或者位移等异常状态出现时&#xff0c;由于人员巡查的范围较大从而无法及时察觉所导致的。为了保障道路行人和车辆的安全&#xff0c;对于井盖的监测需要不断完善和升级。而…

Google分析中的基础概念

当提到Google分析时&#xff0c;我们通常指的是一种用于跟踪和分析网站和应用程序数据的工具。在使用Google分析之前&#xff0c;了解其基础概念对于正确配置和有效使用该工具非常重要。 1、帐户&#xff08;Account&#xff09;&#xff1a;帐户是Google分析中的最高层级。一…

【Axure高保真原型】区间评分条

今天和大家分享区间评分条的原型模板&#xff0c;我们可以左右拖动移动滑块到指定位置&#xff0c;评分条上方会根据两个滑块所在的位置&#xff0c;自动计算出对应的区间范围&#xff1b;这个原型模板使用也很简单&#xff0c;只需要在里面填写区间的最大值&#xff0c;即可自…

python——第十五天

面向对象和面向对象编程 面向对象编程&#xff1a; C语言是一门面向过程的编程语言&#xff01;&#xff01;&#xff01; 面向对象的编程思想 就是分门别类的一种能力 面向对象的概念 类&#xff1a; 对一类事物的统称 对象&#xff1a; 一类事物中的具体案例 面向对象的…

SpringBoot项目整合Redis,Rabbitmq发送、消费、存储邮件

&#x1f4d1;前言 本文主要是【Rabbitmq】——SpringBoot项目整合Redis&#xff0c;Rabbitmq发送、消费、存储邮件的文章&#xff0c;如果有什么需要改进的地方还请大佬指出⛺️ &#x1f3ac;作者简介&#xff1a;大家好&#xff0c;我是听风与他&#x1f947; ☁️博客首页…

select选择框里填充图片

遇到一个需求&#xff0c;选择下拉框选取图标&#xff0c;填充到框里 1、效果展示 2、代码 <el-form-item label"工种图标" class"Form_icon Form_label"><el-select ref"select" :value"formLabelAlign.icon" placeholder&…

centos7内核升级(k8s基础篇)

1.查看系统内核版本信息 uname -r 2.升级内核 2.1更新yum源仓库 yum -y update更新完成后&#xff0c;启用 ELRepo 仓库并安装ELRepo仓库的yum源 ELRepo 仓库是基于社区的用于企业级 Linux 仓库&#xff0c;提供对 RedHat Enterprise (RHEL) 和 其他基于 RHEL的 Linux 发行…

私域流量灵魂三问

私域流量灵魂三问: 1、是什么&#xff1f; 2、为什么做&#xff1f; 3、怎么做&#xff1f;