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.hqwc.cn/news/211099.html

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

相关文章

JAVA实现flappy bird游戏

图片素材 实现代码 import javax.imageio.ImageIO; import javax.swing.*; import java.awt.*; import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; import java.awt.image.BufferedImage; import java.util.Date; import java.text.SimpleDateFormat; i…

项目管理中的资源日历是什么?有什么作用

管理项目不仅需要规划和预算&#xff0c;还需要日程安排。 资源日历是一种显示项目经理或团队领导在特定时间内可用资源的工具。这种类型的项目日历可以显示团队成员和设备在特定时间段内的可用工作时间。 例如&#xff0c;如果一名员工每天工作 8 小时&#xff0c;而他已经在…

python+django高校科研项目管理系统2u3mx

高校科研项目管理系统采用拟开发的高校科研项目管理系统通过测试,确保在最大负载的情况下稳定运转,各个模块工作正常,具有较高的可用性。系统整体界面简洁美观,用户使用简单,满足用户需要。在因特网发展迅猛的当今社会,高校科研项目管理系统必然会成为在数字信息化建设的一个重…

GaussDB技术解读系列:数据实例的连接

GaussDB是华为公司倾力打造的自研企业级分布式关系型数据库&#xff0c;该产品具备企业级复杂事务混合负载能力&#xff0c;同时支持优异的分布式事务&#xff0c;同城跨AZ部署&#xff0c;数据0丢失&#xff0c;支持1000扩展能力&#xff0c;PB级海量存储等企业级数据库特性。…

程序员进阶高管指南,看懂工资最少加5k

从象牙塔毕业跨入社会大染缸&#xff0c;很多人都跟我谈过他们的职业困惑&#xff0c;其中有一些刚刚毕业&#xff0c;有些人已经工作超过10年。基本上是围绕着怎样持续提升&#xff0c;怎样晋升为高级管理者。那么这篇文章&#xff0c;我就来谈一谈程序员到高管的跃升之路。 …

10.分组循环练习题

分组循环 https://leetcode.cn/problems/longest-even-odd-subarray-with-threshold/solutions/2528771/jiao-ni-yi-ci-xing-ba-dai-ma-xie-dui-on-zuspx/?envTypedaily-question&envId2023-11-16 分组循环 适用场景&#xff1a; 按照题目要求&#xff0c;数组会被分割成若…

Java核心知识点整理大全10-笔记

往期快速传送门&#xff1a; Java核心知识点整理大全-笔记_希斯奎的博客-CSDN博客文章浏览阅读9w次&#xff0c;点赞7次&#xff0c;收藏7次。Java核心知识点整理大全https://blog.csdn.net/lzy302810/article/details/132202699?spm1001.2014.3001.5501 Java核心知识点整理…

linux上的通用拍照程序

最近因为工作需要&#xff0c;在ubuntu上开发了一个拍照程序。 为了找到合适的功能研究了好几种实现方式&#xff0c;在这里记录一下。 目录 太长不看版 探索过程 v4l2 QT opencv4.2 打开摄像头 为什么不直接打开第一个视频节点 获取所有分辨率 切换摄像头 太长不看…

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

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

文章解读与仿真程序复现思路——中国电机工程学报EI\CSCD\北大核心《计及电动汽车需求响应的高速公路服务区光储充鲁棒优化配置》

这个标题涉及到一个关于高速公路服务区的优化配置问题&#xff0c;其中考虑了电动汽车需求响应和光储充的因素。让我们逐步解读这个标题&#xff1a; 高速公路服务区&#xff1a; 涉及到高速公路上的服务区&#xff0c;这是供驾驶员休息、加油、用餐等的地方。 电动汽车需求响…

【C语言:深入理解指针二】

文章目录 1. 二级指针2. 指针数组3. 字符指针变量4. 数组指针变量5. 二维数组传参的本质6. 函数指针变量7. 函数指针数组8. 转移表9. 回调函数10. qsort函数的使用与模拟实现 1. 二级指针 我们知道&#xff0c;指针变量也是变量&#xff0c;它也有自己的地址&#xff0c;使用什…

修改QtCreator/QDesigner的对象指示器高亮颜色

一、前言 QtCreator的设计中&#xff0c;高亮颜色太接近了&#xff0c;在左边点一个对象后&#xff0c;很难在右边对上&#xff0c;体验极差。 二、解决方案 创建一份style.qss&#xff0c;写入以下的样式&#xff1a; /* for QtCreator */ QDockWidget #ObjectInspector …