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();//实例化对象,线程t1
        myThread t2 = new myThread("有参构造设置名称");//实例化对象,线程t2并调用有参构造给线程设置名称

        t1.setName("线程1");//设置线程t1的名字

        t1.start();//启动线程t1
        t2.start();//启动线程t2

    }
}

class myThread extends Thread {//自定义子类myThread继承Thread类

    myThread() {

    }

    myThread(String name) {
        super(name);
        System.out.print("有参构造被调用");
    }

    @Override
    public 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类


    @Override
    public 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类


    @Override
    public 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 {//这个线程是非守护线程


    @Override
    public void run() {//重写run()方法,打印10次
        for (int i = 1; i <= 10; i++) {
            System.out.println(getName() + "打印了" + i);
        }
    }
}

class myThread2 extends Thread {//这个线程是守护线程


    @Override
    public 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.mfbz.cn/a/181203.html

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

相关文章

Python基础【三】--数据类型-Number【2023.11.23】

1.数值类型 Number数据类型只要包括三个分别是&#xff1a;整型&#xff08;int&#xff09;、浮点型&#xff08;float&#xff09;、复数&#xff08;complex&#xff09; 整型&#xff1a;包括正整数、负整数。如&#xff1a;1024、-1024。整型有四种进制表示&#xff0c;分…

Rust语言入门教程(二) - 变量与作用域

变量与作用域 变量的声明与初始化 Rust的基本语法格式如下&#xff1a; fn main(){let bunnies 2; }语句以分号结尾&#xff0c;用花括号包含语句块。 Rust的语法其实借鉴了很多其他的语言&#xff0c;比如C语言和Python&#xff0c; 所以变量定义的格式看起来也跟很多我们…

Windows如何使用key登录Linux服务器

场景&#xff1a;因为需要回收root管理员权限&#xff0c;禁止root用户远程登录&#xff0c;办公环境只允许普通用户远程登录&#xff0c;且不允许使用密码登录。 一、生成与配置ssh-key 1.使用root管理员权限登录到目标系统。 2.创建一个新的普通用户&#xff0c;和设置密码用…

java--static的注意事项

1.使用类方法、实例方法时的几点注意事项 ①类方法中可以直接访问类的成员&#xff0c;不可以直接访问实例成员。 ②实例方法中既可以直接访问类成员&#xff0c;也可以直接访问实例成员。 ③实例方法中可以出现this关键字&#xff0c;类方法中不可以出现this关键字的。

教育机构拒绝“数据陷阱”,群硕将英孚新一代教学管理系统搬上桌

为什么小机构年年担心招生不够&#xff0c;英孚却令学生家长趋之若鹜&#xff1f; 区别就在教学管理方式。为了更好地管理分布全球的校区、学生和老师&#xff0c;英孚应用了一套教学管理系统&#xff0c;帮助学校管理学员&#xff0c;帮老师智慧排课&#xff0c;帮助家长记录…

地埋式积水监测仪厂家直销推荐,致力于积水监测

地埋式积水监测仪是一种高科技设备&#xff0c;能够实时监测地面积水深度&#xff0c;并及时发出预警信息&#xff0c;有效避免因积水而产生的安全隐患。这种智能监测仪可以安装在城市道路、立交桥、地下车库等易积水地势较低的地方&#xff0c;以确保及时监测特殊地段的积水&a…

边海防可视化智能视频监控与AI监管方案,助力边海防线建设

一、背景与需求 我国有3万多公里的边境线和海岸线&#xff0c;随着我国边海防基础设施建设的快速发展&#xff0c;边海安防也逐渐走向智能化。传统人工巡防的方式已经无法满足边海智能化监管的需求&#xff0c;在沿海、沿边地区进行边海智慧安防视频监控系统等边海防基础设施建…

TP5制作图片压缩包

目标:将多张图片制成在一个压缩包内,供调取使用 public function test() {//引入压缩包类$zip new \ZipArchive();//新定义一个zip包$zipname ROOT_PATH./public/zip/.date("YmdHis").rand(111,999)..zip;if ($zip->open($zipname, \ZipArchive::CREATE) true…

mongo DB -- aggregate分组查询后字段展示

一、分组查询 在mongoDB中可以使用aggregate中的$group操作对集合中的文档进行分组,但是查询后的数据不显示其他字段,只显示分组字段 aggregate进行分组示例 db.collection.aggregate([{$group: {_id: "$field"}},]) 查询后显示 展开只显示两个字段 二、显示所有字段…

linux通过串口传输文件

简介 在嵌入式调试过程中&#xff0c;我们经常会使用调试串口来查看Log或者执行指令&#xff0c;其实&#xff0c;调试串口还有另一种功能&#xff0c;就是传输文件&#xff0c;本文说明使用MobaXterm串口工具来传输文件。 环境要求 嵌入式系统需要安装lsz和lrz&#xff0c;…

【深度学习实验】图像处理(一):Python Imaging Library(PIL)库:图像读取、写入、复制、粘贴、几何变换、图像增强、图像滤波

文章目录 一、实验介绍二、实验环境1. 配置虚拟环境2. 库版本介绍 三、实验内容0. 安装 PIL 库1. 图像读取和写入a. 图像读取b. 图像写入c. 构建新图像 2. 图像复制粘贴a. 图像复制b. 图像局部复制c. 图像粘贴 3. 几何变换a. 图像调整大小b. 图像旋转c. 图像翻转 4. 图像增强a.…

智慧法院 | RPA+AI打造智慧执行助手,解决“案多人少”现实难题

为深化政法智能化建设&#xff0c;加强“智慧治理”“智慧法院”“智慧检务”“智慧警务”“智慧司法”等信息平台建设&#xff0c;深入实施大数据战略&#xff0c;实现科技创新成果同政法工作深度融合。法制日报社于今年3月继续举办了2023政法智能化建设创新案例及论文征集宣传…

在游戏开发中,实时渲染和离线渲染对于游戏平衡的影响有哪些?

实时渲染和离线渲染对游戏平衡有那些影响呢&#xff1f;在游戏开发中&#xff0c;渲染方式的选择对游戏的整体表现和玩家体验有着至关重要的作用。那么&#xff0c;实时渲染和离线渲染究竟有哪些利弊呢&#xff1f; 一、实时渲染 实时渲染&#xff0c;顾名思义&#xff0c;是…

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

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

【Spring集成MyBatis】MyBatis的Dao层实现(基于配置,非注解开发)

文章目录 1. MyBatis的dao层实现(传统方式)——需要写接口及其实现类2. MyBatis的代理开发方式——仅需写接口 1. MyBatis的dao层实现(传统方式)——需要写接口及其实现类 传统方式就是在项目下边建立dao包&#xff0c;里面包含接口及其实现类&#xff0c;文件结构如下&#x…

3D人脸扫描设备助力企业家数字人复刻,打破商业边界

京都薇薇推出数字人VN&#xff0c;以京都薇薇董事长为原型制作&#xff0c;赋能品牌直播、短片宣传、线上面诊等活动&#xff0c;进一步增强消费者对品牌的交互体验&#xff0c;把元宇宙与品牌相融合&#xff0c;推动品牌线上服务与线下服务实现数字一体化&#xff0c;打造一个…

Linux宝塔面板搭建Discuz论坛, 并内网穿透实现公网访问

Linux宝塔面板搭建Discuz论坛&#xff0c; 并内网穿透实现公网访问 文章目录 Linux宝塔面板搭建Discuz论坛&#xff0c; 并内网穿透实现公网访问前言1.安装基础环境2.一键部署Discuz3.安装cpolar工具4.配置域名访问Discuz5.固定域名公网地址6.配置Discuz论坛 &#x1f4f7; 江池…

基于C#实现线段树

一、线段树 线段树又称"区间树”&#xff0c;在每个节点上保存一个区间&#xff0c;当然区间的划分采用折半的思想&#xff0c;叶子节点只保存一个值&#xff0c;也叫单元节点&#xff0c;所以最终的构造就是一个平衡的二叉树&#xff0c;拥有 CURD 的 O(lgN)的时间。 从…

XC3320 离线式、无电感交流输入线性稳压器 可替代KP3310 固定5V输出电压

XC3320 是一款紧凑型无电感设计的离线式线性稳压器。XC3320 可获得 5V输出电压。XC3320 是一种简单可靠的获得偏置供电的离线式电源解决方案。XC3320 集成了 650V 功率 MOSFET&#xff0c;启动控制电路,VDD 电压控制电路,AC 交流信号同步检测电路&#xff0c;低压差稳压器等。该…

电动机保护方式

3.3.1、电动机温度保护 温度保护是利用安装在电动机内部的温度继电器或变换器来实现的。当电动机达到一定温度时继电器动作&#xff0c;通过控制电路断开电动机的主电路。对于单相小容量电动机&#xff0c;可以用继电器直接断开动力电路。 根据温度传感器的不同可以分为&…
最新文章