Thread类常用成员方法

点击链接返回标题->

Java线程的学习-CSDN博客


目录

前言

有关线程名字的成员方法:

String getName()

void setName(String name)

Thread(String name)

 获取线程对象的成员方法:

static Thread currentThread()

让线程睡眠的成员方法:

static void sleep(long time) throws InterruptedException

有关线程优先级的成员方法

int getPriority()

void setPriority(int newPriority)

守护线程

void setDaemon(boolean on)

礼让线程

 static void yield()

插入线程 

void join() throws InterruptedException



前言

在上一篇中学习了多线程的3种实现方式,其实已经不可避免地涉及到了Thread类的部分成员方法,有用setName()方法设置线程名字,用getName()方法获取当前线程名字,以及一个Thread类的静态方法currentThread()可以获取到当前线程的实例化对象。

本篇我们就来系统性地学习、记录一下Thread类中常用的成员方法。


有关线程名字的成员方法:

String getName()

该方法将以String对象返回当前线程的名字。

特殊的,如果未设置线程名,该方法将返回"Thread-number",其中number按线程的实例化顺序从0开始编号自增。

特殊的,main方法执行的进程(即主进程)名字默认为main,下面两张图验证了这个说法——

示例代码:


void setName(String name)

调用该方法时传入String对象,将为当前线程设置名字,前文已经多次涉及。

Thread(String name)

该方法是Thread类的有参构造方法,在实例化线程对象时传入String对象可以直接完成线程名字设置。

需要注意的是!通常我们会通过自定义子类继承Thread类的方式来实现多线程,但子类不会继承父类的构造方法!因此这种情况下必须使用super关键字去调用父类的构造方法。

示例代码:

部分运行结果:

测试代码:

public class Main {public static void main(String[] args) {myThread t1 = new myThread();//实例化对象,线程t1myThread t2 = new myThread("有参构造设置名称");//实例化对象,线程t2并调用有参构造给线程设置名称t1.setName("线程1");//设置线程t1的名字t1.start();//启动线程t1t2.start();//启动线程t2}
}class myThread extends Thread {//自定义子类myThread继承Thread类myThread() {}myThread(String name) {super(name);System.out.print("有参构造被调用");}@Overridepublic void run() {//重写run()方法for (int i = 1; i <= 100; i++) {System.out.println("当前线程名字为:" + getName());}}
}


 获取线程对象的成员方法:

static Thread currentThread()

这个方法可以获取当前线程的实例化对象,前面已经多次涉及。

对于主线程main,这里补充了一些细节——

  • 当JVM虚拟机启动之后,会自动启动多条线程
  • 其中一条线程就叫main线程
  • 它的作用就是去调用main方法,并执行里面的代码
  • 在以前,我们写的所以代码,其实都是运行在main线程中(没有开多线程)

让线程睡眠的成员方法:

static void sleep(long time) throws InterruptedException

这个方法是Thread的静态方法,它的作用时让当前线程“睡眠”(即暂停运行)time毫秒

注意time的单位是毫秒->1秒(s)等于1000毫秒(ms)

调用该静态方法的方法需要声明抛出InterruptedException异常类或者用try...catch...finally语句处理异常,否则代码无法运行。

示例代码:

public class Main {public static void main(String[] args) throws InterruptedException {System.out.println("第一句话打印完后main线程睡眠7秒");Thread.sleep(7000);System.out.println("然后继续打印第二句话");}
}

上面的示例展示了main进程的睡眠,如果是在新开的自定义进程睡眠的话,有些许不同之处。主要原因在于,在Thread这个父类中没有声明抛出InterruptedException异常类,所以自定义的子类也不能声明抛出异常,解决方法是使用try...catch...finally语句进行异常处理

有关异常类见本篇->Java异常-CSDN博客

示例代码:

部分运行结果:

public class Main {public static void main(String[] args) throws InterruptedException {myThread t1 = new myThread();myThread t2 = new myThread();t1.start();t2.start();}
}class myThread extends Thread {//自定义子类myThread继承Thread类@Overridepublic void run() {//重写run()方法for (int i = 1; i <= 100; i++) {System.out.println("当前线程名字为:" + getName());try {Thread.sleep(2000);} catch (InterruptedException e) {throw new RuntimeException(e);}}}
}


有关线程优先级的成员方法

计算机当中,线程的调度有两种方式——

  • 抢占式调度:这种方式下,线程完全随机被调度,(假设共3个线程)1完了可能是3,3完了可能是1,接着可能是2,纯靠随机调度(不同线程拥有不同的优先级,优先级越高的线程,被调度的概率越大)。
  • 轮流式调度:这种方式下,线程按顺序轮流调度,(假设共3个线程)1完了到2,2完了到3,3完了又回到1。

在Java中,运用的是抢占式调度,线程的优先级共10级,级别越大的线程其优先级越高,抢到cpu执行权的概率越大,被调度的概率越大。

下图展示了Thread类的源码,其中有3个成员变量,分别表示最低级别1、默认级别5、最高级别10。

int getPriority()

这个方法用来获取当前线程的优先级,对于未设置过优先级的线程,优先级默认为5

下图示例代码验证了这个说法——


void setPriority(int newPriority)

这个方法用来设置当前线程的优先级,传入一个1到10之间整数进行设置。

示例代码:

public class Main {public static void main(String[] args) throws InterruptedException {Thread t = Thread.currentThread();//获取当前线程(即主线程)的实例化对象System.out.println("主线程的优先级为:" + t.getPriority());//打印当前线程的优先级myThread myt1 = new myThread();myThread myt2 = new myThread();//自定义两个线程myt1.setName("线程1");myt2.setName("线程2");//设置两个线程的名字myt1.start();myt2.start();//启动两个线程myt1.setPriority(1);myt1.setPriority(10);//分别设置优先级为1和10,显然线程2的优先级更大,被调度的概率更高}
}class myThread extends Thread {//自定义子类myThread继承Thread类@Overridepublic void run() {//重写run()方法for (int i = 1; i <= 100; i++) {System.out.println(getName() + "打印了" + i);}}
}


守护线程

被设置为守护线程的线程将在其它非守护线程执行完毕后,陆续结束执行(注意此处“陆续”的含义,不是立刻结束)

光看定义确实十分抽象,因此举了一个实际应用场景的例子:

如下图是很常见的qq传输文件场景,对于这个聊天页面,可以认为是线程1,对于传送文件这个过程,可以认为是线程2。

在传输过程中,如果你突然关闭了这个聊天窗口(即结束了线程1),这个时候线程2就会跟着一起结束执行,这种关系下线程2就被称为守护线程。

void setDaemon(boolean on)

这个方法用来设置线程为守护线程,传入一个布尔类型的值true,表示将当前线程设置为守护线程。

代码示例——

public class Main {public static void main(String[] args) throws InterruptedException {myThread1 t1 = new myThread1();myThread2 t2 = new myThread2();t1.setName("线程1");t2.setName("线程2");//分别命名t2.setDaemon(true);//将线程2设置为守护线程t1.start();t2.start();}
}class myThread1 extends Thread {//这个线程是非守护线程@Overridepublic void run() {//重写run()方法,打印10次for (int i = 1; i <= 10; i++) {System.out.println(getName() + "打印了" + i);}}
}class myThread2 extends Thread {//这个线程是守护线程@Overridepublic void run() {//重写run()方法,打印100次for (int i = 1; i <= 100; i++) {System.out.println(getName() + "打印了" + i);}}
}


礼让线程

在多线程中常常遇到下图这种情况,连续好几次一直被同一个线程抢占到cpu的执行权(虽说默认优先等级都是5,但耐不住有的线程比较“欧”

礼让线程的含义就是让当前线程让出当前的cpu执行权,注意,让出执行权之后并不是说执行权就一定给别的线程了,而是让别的线程有更多机会来跟自己抢夺执行权(我只是给你机会,又没说一定给你是吧),所以说让出执行权后又再次抢到的可能也是存在的!

 static void yield()

该静态成员方法用来礼让线程,让出执行权给其它线程更多的执行机会,在一定程度上使执行权均匀分配。


插入线程 

void join() throws InterruptedException

该方法用于将当前线程插入到另一线程之前,被插入的线程结束前不会执行它后面的线程。

调用该静态方法的方法需要声明抛出InterruptedException异常类或者用try...catch...finally语句处理异常,否则代码无法运行。

需要注意的是,插入操作必须写在启动操作之后(即先start后join)!

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

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

相关文章

时间序列分析算法的概念、模型检验及应用

时间序列分析是一种用于研究随时间变化的数据模式和趋势的统计方法。这类数据通常按照时间顺序排列&#xff0c;例如股票价格、气温、销售额等。时间序列分析的目标是从过去的观测中提取信息&#xff0c;以便预测未来的趋势。 以下是关于时间序列分析的一些重要概念、模型检验…

python 数据类型之集合

常见的数据类型&#xff1a; int&#xff0c;整数类型&#xff08;整形&#xff09;bool&#xff0c;布尔类型str&#xff0c;字符串类型list&#xff0c;列表类型tuple&#xff0c;元组类型dict&#xff0c;字典类型&#xff0c;一个容器且元素必须是键值对。set&#xff0c;…

I Doc View在线文档预览系统RCE漏洞(QVD-2023-45061)

0x01 产品简介 iDocView是一个在线文档解析应用&#xff0c;旨在提供便捷的文件查看和编辑服务。 0x02 漏洞概述 漏洞成因 本次漏洞出现在在线文档解析应用中的远程页面缓存功能。具体问题在于该应用未能对用户输入的URL进行充分的安全验证&#xff0c;从而导致存在安全隐患…

前端实现菜单快速检索的功能

前端CSS <style type"text/css">.btn-box {color: #fff;width: auto;border-radius: 25px;min-width: 40px;height: 40px;margin: 9px;line-height: 40px;display: inline-block;position: relative;overflow: hidden;background-image: linear-gradient(315de…

红队攻防实战之内网穿透隐秘隧道搭建

别低头&#xff0c;皇冠会掉&#xff1b;别流泪&#xff0c;贱人会笑。 本文首发于先知社区&#xff0c;原创作者即是本人 0x00 前言 构建内网隐蔽通道&#xff0c;从而突破各种安全策略限制&#xff0c;实现对目标服务器的完美控制。 当我们从外网成功获得攻击点的时候&…

SAP BAPI For LU01/LU04 记账更改

场景&#xff1a;采购收货质检放行的时候&#xff0c;发现存在有些做QA11的时候&#xff0c;进入到TR-ZONE中&#xff0c;没有进入到指定的仓位 解决方案&#xff1a;前端通过LU04进入&#xff0c;可以查看到一些未清的记账更改通知单&#xff0c;点击工具栏上的创建转储单&am…

Docker Swarm总结+service创建和部署、overlay网络以及Raft算法(2/3)

博主介绍&#xff1a;Java领域优质创作者,博客之星城市赛道TOP20、专注于前端流行技术框架、Java后端技术领域、项目实战运维以及GIS地理信息领域。 &#x1f345;文末获取源码下载地址&#x1f345; &#x1f447;&#x1f3fb; 精彩专栏推荐订阅&#x1f447;&#x1f3fb;…

新的预测模型的局部评价指标-pAUROCc

新的预测模型的局部评价指标-pAUROCc Background 局部评价主要是用在不平衡数据上&#xff0c;其合理性&#xff1a;1.局部评价比全局评价敏感&#xff0c;更容易区分模型的优劣&#xff1b;2.临床决策曲线&#xff08;DCA&#xff09;可知&#xff0c;模型使用过程中&#x…

什么是JSX

在React组件中&#xff0c;JSX&#xff08;JavaScript XML&#xff09;是一种语法扩展&#xff0c;用于描述组件的结构和外观。JSX允许我们在JavaScript中编写类似HTML的标记语言&#xff0c;以创建React元素。 在React组件中&#xff0c;render方法是用于定义并返回组件的结构…

HarmonyOS开发(六):构建简单页面

1、Column&Row组件 1.1、概述 一个页面由很多组件组成&#xff0c;如果需要把这些组件组织起来布局好&#xff0c;需要借助容器组件来实现。 容器组件是一种特殊的组件&#xff0c;它可以包含其他组件&#xff0c;而且按照一定的规律布局&#xff0c;一个容器组件中可以…

Linux--初识和基本的指令(2)

目录 前言 1. 指令 1.1 cd其它携带指令 1.2 ls其它携带指令 1.3 which指令 1.4 alias指令 1.5 mkdir其他携带指令 1.7 yum -y install 安装指令 1.8 stat指令 1.9解决指令失控状态 1.10 rmdir&&rm指令 1.11 man指令 1.12 cp指令 1.13 mv指令 1.14 nano…

vue项目引入中国地图

先安装有china.js的版本 npm install echarts4.8 --save //以前的版本有china.js <template><div class"mapMain"><div id"map" style"width: 30vw; height: 30vw;" /></div> </template><script>//引入文…

提高苹果企业签名稳定性的关键方法包括几点

提高苹果企业签名稳定性的关键方法包括以下几点&#xff1a; 控制签名量&#xff1a;苹果企业签名的稳定性与每本书的签发量有很大的关系。一般来说&#xff0c;每本书上签10个APP和每本书上签100个APP是两种不同的概念。为了提高稳定性&#xff0c;正规的签名平台会严格控制每…

「纯电」厮杀,广州车展的年末大戏

作者 |张祥威 编辑 |德新 年末的广州车展&#xff0c;揭开纯电动车激烈厮杀的一角。 1100多款车型亮相在这届车展&#xff0c;其中新能源车有460多辆&#xff0c;占接近一半比例。这其中&#xff0c;人们的焦点又放在十多款纯电车型上。 造车新势力中&#xff0c;理想的首款…

什么是数据确权?

在数字化时代&#xff0c;数据已经成为一种新型资产&#xff0c;”新的石油“&#xff0c;具有巨大的价值&#xff0c;未来世界经济竞争一定程度上是数字经济的竞争&#xff0c;而非工业的竞争。数据相关法律制度&#xff0c;尚且还不完整&#xff0c;推动数字经济的发展&#…

工作流引擎的主要表结构

工作流引擎的主要表结构及其作用如下&#xff0c;我们从开源的驰骋工作流为例来说明。 1. WF_GenerWorkFlow&#xff1a;该表主要用于存储流程引擎级别的数据, 发起人&#xff0c;发起日期&#xff0c;workid, 流程状态&#xff0c;流程标题&#xff0c;运行到的节点。 2. WF_…

快速入门go语言学习笔记

文章目录 1、初识go1.1、go语言1.2 第一个Go程序 2、基础类型2.1、命名2.2、变量2.2.1 变量声明2.2.2 变量初始化2.2.3 变量赋值2.2.4 匿名变量 2.3、常量2.3.1 字面常量(常量值)2.3.2 常量定义2.3.3 iota枚举 2.4、基础数据类型2.4.1 分类2.4.2 布尔类型2.4.3 整型2.4.4 浮点型…

逆向扒cocosjs安卓包教程-破解加密的js源码

本文只适用于cocosjs引擎打包的游戏apk,针对此类apk进行源码级别的逆向破解,可直接逐个破解工程内的源码部分,让游戏逻辑大白于你的面前,你可以针对js源码进行二次开发。按照我的教程破解过程中遇到什么问题,欢迎留言。 准备apk包 准备一个你确定用cocosjs打包好的apk包…

XSLVGL2.0 User Manual 资源管理器(v2.0)

XSLVGL2.0 开发手册 XSLVGL2.0 User Manual 资源管理器 1、概述2、特性3、APIs3.1、xs_resource_get3.2、xs_resource_get_string3.3、xs_resource_set_search_dir3.4、xs_resource_bind_id3.5、xs_resource_set_lang_desc3.6、xs_resource_update3.7、xs_resource_unbind_id3…