当前位置: 首页 > news >正文

【Java 基础】20 多线程操作方法

文章目录

    • 1.获取和设置线程的名字
      • 1)获取默认名字
      • 2)获取自定义的名字
    • 2.判断线程是否启动
    • 3.线程的强制执行
    • 4.让线程睡一会儿
    • 5.中断线程
    • 6.守护线程
    • 7.线程的礼让

前一节我们介绍了线程的定义、创建方法、状态以及各状态间的转换。在状态转换处只是简单的说明了一下,比如从运行(Running)状态转换到就绪(Runnable)状态应该使用 yield() 方法来主动让出CPU时间 ,但是 yield() 方法是什么并没有说明,本节我们将接着前一节继续介绍一下常用的线程操作方法。

1.获取和设置线程的名字

Thread 类中我们可以使用 getName() 方法来获取线程的名字,如果想自己设定线程的名字还可以使用 setName() 方法。线程的名字通常在启动线程前进行设置,但是,运行中的线程也是可以为其设定名字的。如果没有设置名字的话,它会有一个默认的名字 Thread-xxx

1)获取默认名字

实例代码:

public class Demo {public static void main(String[] args) {ThreadDemo threadDemo = new ThreadDemo();new Thread(threadDemo).start();}
}
class ThreadDemo implements Runnable {@Overridepublic void run() {// 打印当前线程的名字System.out.println(Thread.currentThread().getName());}
}

输出结果:

Thread-0

2)获取自定义的名字

实例代码:

public class Demo {public static void main(String[] args) {ThreadDemo threadDemo = new ThreadDemo();// 创建线程并设置名字new Thread(threadDemo, "线程测试者").start();}
}class ThreadDemo implements Runnable {@Overridepublic void run() {// 打印当前线程的名字System.out.println(Thread.currentThread().getName());}
}

输出结果:

线程测试者

2.判断线程是否启动

通过 Thread 类中的 start() 方法可以启动一个线程,并且通知 CPU 这个线程已经准备就绪可以启动了,然后就坐等 CPU 为其分配资源运行啦。我们可以使用 isAlive() 方法来检测线程是否已启动并且扔在运行。

实例代码:

public class Demo {public static void main(String[] args) {ThreadDemo threadDemo = new ThreadDemo();Thread thread = new Thread(threadDemo);System.out.println("Before start isAlive():" + thread.isAlive());thread.start();System.out.println("After start isAlive():" + thread.isAlive());}
}class ThreadDemo implements Runnable {@Overridepublic void run() {System.out.println("Running...");}
}

输出结果:

Before start isAlive():false
After start isAlive():true
Running…

3.线程的强制执行

操作线程的时候,可以使用 join() 方法让一个线程强制运行,在此线程强制运行期间别的线程不能运行,必须等这个线程完成了才可以继续运行其他的。

观察 上一个 判断线程启动的示例,会发现 居然是 先输出 After 然后 才输出的 Running

那么能不能先强制执行 ThreadDemo 让 Running 在 After 之前呢?答案是可以的,使用 join() 方法强制运行即可

实例代码:

public class Demo {public static void main(String[] args) throws Exception {ThreadDemo threadDemo = new ThreadDemo();Thread thread = new Thread(threadDemo);System.out.println("Before start isAlive():" + thread.isAlive());thread.start();// 强制运行thread.join();// 此条代码就要等上面线程执行完成后,才可以执行,所以 isAlive() 也会是 falseSystem.out.println("After start isAlive():" + thread.isAlive());}
}class ThreadDemo implements Runnable {@Overridepublic void run() {System.out.println("Running...");}
}

输出结果:

Before start isAlive():false
Running…
After start isAlive():false

4.让线程睡一会儿

假如我们想让线程睡一会儿,则可以使用 Thread.sleep() 方法。

示例代码:

public class Demo {public static void main(String[] args) throws Exception {ThreadDemo threadDemo = new ThreadDemo();Thread thread = new Thread(threadDemo);thread.start();}
}class ThreadDemo implements Runnable {@Overridepublic void run() {try {// 先让我睡 5 秒for (int i = 0; i < 5; i++) {Thread.sleep(1000);System.out.println("睡了 " + (i + 1) + " 秒");}} catch (InterruptedException e) {throw new RuntimeException(e);}}
}

输出结果:

睡了 1 秒
睡了 2 秒
睡了 3 秒
睡了 4 秒
睡了 5 秒

5.中断线程

在一个线程正在运行的时候,其他线程可以使用 interrupt()方法去中断它的运行状态。

观察 上一个 让线程睡一会儿的示例,一睡就要睡 5 秒

那么能不能睡2秒后提前把它喊醒?答案是可以的,使用 interrupt() 方法

示例代码:

public class Demo {public static void main(String[] args) throws Exception {ThreadDemo threadDemo = new ThreadDemo();Thread thread = new Thread(threadDemo);thread.start();// 在刚过 2 秒的时候,将其喊醒Thread.sleep(2001);thread.interrupt();}
}class ThreadDemo implements Runnable {@Overridepublic void run() {try {// 先让我睡 5 秒for (int i = 0; i < 5; i++) {Thread.sleep(1000);System.out.println("睡了 " + (i + 1) + " 秒");}} catch (InterruptedException e) {System.out.println("被其他人吵醒(中断)了");}}
}

输出结果:

睡了 1 秒
睡了 2 秒
被其他人吵醒(中断)了

6.守护线程

有时候我们只想要前台有一个线程在运行,则整个 Java 进程都不会消失,所以此时就需要一个守护线程,这样即使 Java 进程执行完结束了,那么这个守护线程依然在执行。这时候就可以使用 setDaemon() 方法啦。

示例代码:

public class Demo {public static void main(String[] args) {ThreadDemo threadDemo = new ThreadDemo();Thread thread = new Thread(threadDemo);thread.setDaemon(true);thread.start();}
}class ThreadDemo implements Runnable {@Overridepublic void run() {while (true) {try {Thread.sleep(5000);System.out.println("running");} catch (InterruptedException e) {throw new RuntimeException(e);}}}
}

此处 ThreadDemo 线程里面尽管是一个死循环,但程序依然可以执行完,因为这个方法中的死循环已经是去后台了,它不会阻止外面程序的结束。

7.线程的礼让

当一个线程在运行时,能不能让它先停下来一下,给其它线程一个运行的机会,这时候就可以使用 yield() 方法来暂时让出 CPU 的资源。

示例代码:

public class Demo {public static void main(String[] args) throws InterruptedException {ThreadDemo threadDemo = new ThreadDemo();Thread t1 = new Thread(threadDemo,"线程1");Thread t2 = new Thread(threadDemo,"线程2");t1.start();t2.start();t1.join();t2.join();}
}class ThreadDemo implements Runnable {@Overridepublic void run() {String tName = Thread.currentThread().getName();for (int i = 0; i < 5; i++) {System.out.println(tName + "运行第" + (i+1) + "次");if (i == 2) {System.out.println(tName + "主动让出");Thread.yield();}}}
}

输出结果:

线程2运行第1次
线程2运行第2次
线程2运行第3次
线程2主动让出
线程1运行第1次
线程1运行第2次
线程1运行第3次
线程1主动让出
线程2运行第4次
线程2运行第5次
线程1运行第4次
线程1运行第5次

从结果可以发现,当执行完 3 次之后,就把 CPU 资源让出来了,给其它线程一个可以执行的机会。

线程操作方法还有很多其他的,这里只列出来了几个常用的,好好去掌握可以更好的操作线程。

相关文章:

【Java 基础】20 多线程操作方法

文章目录 1.获取和设置线程的名字1&#xff09;获取默认名字2&#xff09;获取自定义的名字 2.判断线程是否启动3.线程的强制执行4.让线程睡一会儿5.中断线程6.守护线程7.线程的礼让 前一节我们介绍了线程的定义、创建方法、状态以及各状态间的转换。在状态转换处只是简单的说明…...

SpringBoot使用mybatis-plus分页查询无效解决方案

问题概述 SpringBoot中使用mybatis-plus实现分页查询时&#xff0c;提供一个page分页对象和一个QueryWrapper条件类对象&#xff0c;在使用Service.page(page,queryWrapper)方法进行分页查询时&#xff0c;发现并未查询到分页的结果&#xff0c;反而是查询到全部符合条件的结果…...

QT 中 线程池 (备查)

QRunnable类 API 1&#xff09;在Qt中使用线程池需要先创建任务&#xff0c;添加到线程池中的每一个任务都需要是一个 QRunnable 类型&#xff0c;因此在程序中需要创建子类继承 QRunnable 这个类。 2&#xff09;然后重写 run() 方法&#xff0c;在这个函数中编写要在线程池中…...

LeetCode刷题笔记第71题:简化路径

LeetCode刷题笔记第71题&#xff1a;简化路径 题目 给定一个路径&#xff0c;简化路径 要求&#xff1a; 1、以’/‘开头 2、两个目录之间只有一个’/’ 3、不能以’/‘结尾 4、路径中不能有’.‘和’…’ 想法 利用栈的数据存储方式的思想&#xff0c;将路径字符顺序入栈遇…...

JavaScript <md5加密的两种不同输出结果分析>--案例(二点一)

前言: 问题是这样的,在浏览器中看到这段代码 然后在控制台进行输出.得到: 紧接着,就在,js文件里面进行转译: 可是,得到的结果是: 这是问题!!! 正题: 为什么相同的js代码,在 .js 文件中的输出与 Chrome 控制台中的输出不一样? 环境差异&#xff1a;不同的JavaScript环境&…...

『亚马逊云科技产品测评』活动征文|基于亚马逊EC2云服务器配置Nginx静态网页

授权声明&#xff1a;本篇文章授权活动官方亚马逊云科技文章转发、改写权&#xff0c;包括不限于在 Developer Centre, 知乎&#xff0c;自媒体平台&#xff0c;第三方开发者媒体等亚马逊云科技官方渠道 亚马逊EC2云服务器&#xff08;Elastic Compute Cloud&#xff09;是亚马…...

28、卷积 - 卷积的基础公式

本节推导一下卷积的基础公式,还是先上一张卷积运算的示意图图。 我们知道,一张图片有 3 个维度,分别是长、宽、通道。 这三个维度分别用 3 个字母代替,分别是 H(Height, 对应的是长这一维度), W(Width, 对应的是宽这一维度),C(Channel,对应的是通道这一维度)。 对于…...

Mac电脑vm虚拟机 VMware Fusion Pro中文 for mac

VMware Fusion Pro是一款功能强大的虚拟机软件&#xff0c;适用于需要在Mac电脑上运行其他操作系统的用户。它具有广泛的支持、快速稳定的特点以及多种高级功能&#xff0c;可以满足用户的各种需求和场景。 多操作系统支持&#xff1a;VMware Fusion Pro允许在Mac电脑上运行多…...

区块链技术的应用场景和优势

目录 一、引言 二、什么是区块链技术 三、区块链技术的应用场景 1.金融领域 &#xff08;1&#xff09;支付和清算&#xff1a;区块链可以为支付和金融结算提供更加快速、安全、便捷的方式。例如瑞士银行UBS和Deutsche Bank已经合作开发了基于区块链的支付和清算系统。 &a…...

java面试题-谈谈sql优化-mysql

远离八股文&#xff0c;面试大白话&#xff0c;通俗且易懂 看完后试着用自己的话复述出来。有问题请指出&#xff0c;有需要帮助理解的或者遇到的真实面试题不知道怎么总结的也请评论中写出来&#xff0c;大家一起解决。 这是面试总结出来的几点&#xff0c;每次问道都是这么回…...

【Linux服务器Java环境搭建】07 在linux中安装MySql,以及对MySQL的配置与远程连接

【Linux服务器Java环境搭建】01购买云服务器以及在服务器中安装Linux系统 【Linux服务器Java环境搭建】02 通过xftp和xshell远程连接云服务器 【Linux服务器Java环境搭建】03 Git工具安装 【Linux服务器Java环境搭建】04 JDK安装&#xff08;JAVA环境安装&#xff09; 【Linux服…...

用 LangChain 搭建基于 Notion 文档的 RAG 应用

如何通过语言模型查询 Notion 文档&#xff1f;LangChain 和 Milvus 缺一不可。 在整个过程中&#xff0c;我们会将 LangChain 作为框架&#xff0c;Milvus 作为相似性搜索引擎&#xff0c;用二者搭建一个基本的检索增强生成&#xff08;RAG&#xff09;应用。在之前的文章中&a…...

QT中如何使用自定义控件

在 Qt 中&#xff0c;要使用自定义控件&#xff0c;需要遵循以下步骤&#xff1a; 创建自定义控件&#xff1a; 首先&#xff0c;需要创建一个自定义控件类&#xff0c;该类继承自 QWidget 或 QGraphicsItem 等基本控件类&#xff0c;并实现其相关函数和槽函数等。 在头文件中…...

xcode ——Instrumets(网络连接调试)使用

环境&#xff1a; instruments 使用只能在真机调试时使用&#xff0c;且真机系统必须ios15 点击debug 按钮——Network——Profile in Instruments 然后就可以看到如下面板 展开运行的项目&#xff0c;点击session下的域名&#xff0c;下方回出现该域名下的网络请求。点击Deve…...

Ps:文字操作常用快捷键

对文字的设置操作&#xff0c;可在工具选项栏或“字符”面板上进行。但是&#xff0c;如果能记住并使用快捷键&#xff0c;可大大提高工作效率。 设置文字颜色 Color 1、选中几个或全部文字后&#xff0c;除了使用工具选项栏上的“颜色”按钮&#xff0c;还可以使用快捷键 Alt…...

SpringSecurity的默认登录页的使用

SpringSecurity的默认登录页的使用 01 前期准备 引入依赖 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><!--mysql驱动--><dependency><grou…...

【Rust日报】2023-12-04 slint 成功案例

slint 成功案例 SK Signet是美国领先的电动车充电解决方案提供商&#xff0c;推出了适用于其电动车充电桩的新型HMI&#xff08;人机界面&#xff09;。支持15英寸和32英寸触摸屏。 该HMI由Slint制作&#xff0c;为充电站运营商提供了额外的商机。SK Signet经理Sang-Baek Lee表…...

嵌入式硬件和软件哪个好?

嵌入式硬件和软件哪个好? 嵌入式软硬件工程师哪个更有前途呢?一起来看看。 嵌入式是分为软硬件工程师的&#xff0c;首先我们先来看看嵌入式硬件工程师吧! 嵌入式硬件开发工程师主要编写嵌入式系统硬件总体方案和详细方案&#xff0c;要求理解嵌入式系统架构&#xff0c;有一…...

MySQL 8.x 自签证书通过keytool和openssl转成JKS文件

一、写在前面 数据库MySQL 8.0 通过自签命令在datadir下生成了所有的证书文件。由于Java的JDK不支持直接加载PEM格式的证书&#xff0c;所以需要将PEM格式证书转换成Java能够直接加载的JKS格式证书。我们需要将根证书ca.pem转换成JKS格式的根证书truststore.jks&#xff0c;将…...

MybatisPlus概述

MybatisPlus概述 无侵入&#xff1a;只做增强不做改变&#xff0c;引入它不会对现有工程产生影响&#xff0c;如丝般顺滑损耗小&#xff1a;启动即会自动注入基本 CURD&#xff0c;性能基本无损耗&#xff0c;直接面向对象操作强大的 CRUD 操作&#xff1a;内置通用 Mapper、通…...

C++之枚举与宏定义

1 枚举enum C的枚举类型可以用来表示一组有限且固定的值。比如在如下代码中&#xff1a; enum Color { RED, GREEN, BLUE };定义了Color的枚举类型&#xff0c;分别对应三种不同的颜色。C编译器会为枚举类型的常量分配整数值&#xff0c;从0开始递增。因此&#xff0c;在这个…...

DAPP开发【09】NFT交易市场开发(hardhat测试)

测试文件下新建market.js文件 扁平化&#xff0c;将所有依赖放在tmp.sol&#xff0c;可以去给他人使用 npx hardhat flatten > tmp.sol 测试文件 const {expect} require(chai); const {ethers} require(hardhat);describe(Market,async function(){//定义三个合约&a…...

【Spring Boot】如何通过RestTemplate获取另一个服务的接口返回信息

背景 在查询订单信息的时候&#xff0c;需要获取用户的信息&#xff0c;同时订单和用户分属于不同的服务中&#xff0c;并且服务的数据库的数据分开的&#xff0c;其直接连接数据库并操作数据库是不可以的。那我们可以通过RestTemplate对象请求另一个服务的API接口获取相关的响…...

文字识别(OCR)专题——基于NCNN轻量级PaddleOCRv4模型C++推理

前言 PaddleOCR 提供了基于深度学习的文本检测、识别和方向检测等功能。其主要推荐的 PP-OCR 算法在国内外的企业开发者中得到广泛应用。在短短的几年时间里&#xff0c;PP-OCR 的累计 Star 数已经超过了32.2k&#xff0c;常常出现在 GitHub Trending 和 Paperswithcode 的日榜…...

❀My学习Linux命令小记录(14)❀

目录 ❀My学习Linux命令小记录&#xff08;14&#xff09;❀ 56.man指令 57.whatis指令 58.info指令 59.--help指令 60.uname指令 ❀My学习Linux命令小记录&#xff08;14&#xff09;❀ 56.man指令 功能说明&#xff1a;查看Linux中的指令帮助。 &#xff08;ps.man命…...

SqlServer存储过程中使用in

第一步&#xff1a;创建测试存储过程&#xff1a; CREATE PROCEDURE [dbo].[test] deptCode varchar(MAX)AS BEGINSELECT * from DEPT_INFO_A where DEPT_CODE in (deptCode)END 此存储过程只是一个简单的查询 第二步测试&#xff1a; 传入的 deptCode为&#xff1a;101200…...

Selenium+Unittest+HTMLTestRunner框架更改为Selenium+Pytest+Allure(二)

1 代码框架 整体项目结构如图&#xff1a; Common&#xff1a;公共库 Logs&#xff1a; 日志目录 Page&#xff1a; 页面元素 Report&#xff1a;测试报告 TestCase&#xff1a;测试用例 TestData&#xff1a; 测试数据 2 单模块运行 直接上代码&#xff1a; # -*- coding…...

Kotlin Lambda使用

Kotlin Lambda使用 fun main() /*: Unit*/ {// Lambda会慢慢的难度升级// Kotlin Unit Java void// TODO 下面全部都是函数声明&#xff0c; 既然是函数声明&#xff0c;就不能调用// 函数的声明 用lambda去描述函数的声明val method1 : () -> Unitval method2 : (Int, In…...

华容道问题求解第一部分_思路即方案设计

一、前言 华容道是一种传统的益智游戏&#xff0c;通常由一个长方形木板和若干个方块组成。其中包括一个或多个不同颜色的方块&#xff08;也称为车块&#xff09;和其他大小相同的方块&#xff08;也称为障碍块&#xff09;。游戏的目标是将车块从木板的一个端点移动到另一个…...

测试---UI自动化测试介绍

1、什么是自动化测试 概念&#xff1a;由程序代替人工进行系统校验的过程。--------计算机自己执行&#xff0c;好比手机上安装一个软件软件微信&#xff0c;抖音&#xff0c;微博之类的&#xff0c;在应用商城里面&#xff0c;下载对应app后&#xff0c;手机系统程序会自动安…...

网站推广优化流程/seo投放

解决方法将targetSdkVersion更改为27...

长春兼职/保定seo排名优化

前言 鄙人不才&#xff0c;上次写了一篇文章 其中谈到了&#xff0c;如果要作为一个合格的.NET开发人员&#xff0c;需要具备一些什么素质&#xff0c;今天手痒了&#xff0c;想再写一篇文章&#xff0c;谈谈程序员的核心竞争力是什么&#xff0c;怎么培养核心竞争力&#xff1…...

成都设计网站的公司名称/代理怎么引流推广

首先需要安装python环境 见本人发表的&#xff1a;python及pycharm安装python及pycharm安装_susan花雨的博客-CSDN博客 用pip install 安装 pip install xlrd pip install xlwt pip install xlsxwriter pip list查看 python合并多个表格&#xff1a;可以将每个表的不同she…...

深圳福田区房价多少钱一平米/北京seo业务员

前言 SQLite数据库由于其简单、灵活、轻量、开源&#xff0c;已经被越来越多的被应用到中小型应用中。甚至有人说&#xff0c;SQLite完全可以用来取代c语言中的文件读写操作。因此我最近编写有关遥感数据处理的程序的时候&#xff0c;也将SQLite引入进来&#xff0c;以提高数据…...

广州疫情 高位平台/安卓优化大师2021

当用浏览器浏览网页的时候&#xff0c;当我们点击一个连接的时候&#xff0c;浏览器就会转到新的页面去。整个过程如下&#xff1a; 1&#xff09;用户在当前页面点击->2&#xff09;浏览器获取新的URL->3)浏览器转到新的URL。现在&#xff0c;假设我们有一个pdf的阅读程…...

轻量级服务器wordpress密钥/搜索引擎优化的要点

问题所处环境&#xff1a;IIS 7.5, ASP.NET 4.0, 应用程序池(Application Pool)运行于集成模式(Integrated)。 今天一位园友向我们反馈用网摘收藏博客文章LINQ那些事(9)-解析Table<T>.Attach引发的异常和解决方法时出错&#xff08;注意&#xff1a;文章标题中有尖括号&a…...