Thread类常用成员方法

news2024/9/23 15:22:26

点击链接返回标题->

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.coloradmin.cn/o/1244416.html

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

相关文章

穿山甲SDK 集成·android接入广告·app流量变现

接入穿山甲SDK的app 数独训练APP 广告接入示例: Android 个人开发者如何接入广告SDK&#xff0c;实现app流量变现 接入穿山甲SDK app示例&#xff1a; android 数独小游戏 经典数独休闲益智 随着移动互联网的快速发展&#xff0c;广告成为了许多应用开发者获取收益的主要方…

java--static的应用知识:单例设计模式

1.什么是设计模式(Design pattern) ①一个问题通常有n中解法&#xff0c;其中肯定有一种解法最优的&#xff0c;这个最优的解法被人总结出来了&#xff0c;称之为设计模式。 ②设计模式有20多种&#xff0c;对应20多种软件开发中会遇到的问题。 2.单例设计模式 确保一个类只…

Python-Django的“日志功能-日志模块(logging模块)-日志输出”的功能详解

01-综述 可以使用Python内置的logging模块来实现Django项目的日志记录。 所以与其说这篇文章在讲Django的“日志功能-日志模块-日志输出”&#xff0c;不如说是在讲Pthon的“日志功能-日志模块-日志输出”&#xff0c;即Python的logging模块。 下面用一个实例来进行讲解。 …

PubLayNet:电子文档元素识别的有史以来最大数据集

文章目录 摘要引言相关工作文档布局的自动标注布局类别标注算法PMCOA XML预处理和解析PMCOA PDF解析字符串预处理PDF-XML匹配算法生成实例分割质量控制 数据划分 结果基于深度学习的文档分布识别表格检测微调用于不同的领域 讨论结论附录论文中的一些英文单词论文中的其他一些专…

微信小程序汽车租赁系统

微信小程序汽车租赁系统 本系统包含了3类用户&#xff0c;分别为客户、员工以及管理员&#xff0c;客户主要是满足自身的租车需求&#xff0c;员工主要负责车辆的调度问题和维修状况&#xff0c;管理员则是主要对人员、车辆和订单的管理。以下是对各自功能的详细介绍: 客户可…

MySQL的Redo Log跟Binlog

文章目录 概要Redo Log日志Redo Log的作用Redo Log的写入机制 Binlog日志Binlog的作用Binlog写入机制 两段提交 概要 Redo Log和Binlog是MySQL日志系统中非常重要的两种机制&#xff0c;也有很多相似之处&#xff0c;本文主要介绍两者细节和区别。 Redo Log日志 Redo Log的作…

ELK企业级日志分析平台——logstash

部署 新建一台虚拟机elk4部署logstash [rootelk4 ~]# yum install -y jdk-11.0.15_linux-x64_bin.rpm[rootelk4 ~]# yum install -y logstash-7.6.1.rpm 命令方式 [rootelk4 bin]# /usr/share/logstash/bin/logstash -e input { stdin { } } output { stdout {} } elasticsearc…

vivado产生报告阅读分析17-时序报告13

CDC 拓扑结构的简化板级原理图 以下部分展示了 CDC 拓扑结构的简化板级原理图以及简要说明。在所有板级原理图中 &#xff0c; 源时钟信号线 &#xff08; 通常为 clk_a&#xff09; 以蓝色高亮 &#xff0c; 目标时钟信号线 &#xff08; 通常为 clk_b &#xff09; 以橙色…

深度强化学习中的动作屏蔽(Action Masking)

RLlib中的example有一个代码是action_masking&#xff0c;很感兴趣&#xff0c;所以学习了一下 主要功能是&#xff1a; “动作屏蔽”允许代理根据当前观察选择动作。这在许多实际场景中非常有用&#xff0c;在这些场景中&#xff0c;不同的时间步长可以执行不同的操作。解释动…

解决:Gitee + PicGo配置图床失败

解决&#xff1a;Gitee PicGo配置图床失败 PicGo安装插件的时候选择&#xff1a;gitee-uploader&#xff0c;不要选择gitee&#xff01; 在Gitee新建的图床仓库中设置一个images文件夹&#xff0c;用来保存上传的图片&#xff0c;但是要注意在PicGo中的path中要写上路径/img…

视频直播美颜SDK全面解析:美颜SDK技术对比

美颜SDK的出现&#xff0c;为直播主和用户提供了更丰富的美颜体验。 一、美颜SDK的基本原理 美颜SDK多种技术协同工作&#xff0c;使得直播画面更加细腻、自然&#xff0c;给用户带来更好的视觉感受。不同的SDK可能采用不同的算法和处理流程&#xff0c;从而产生各具特色的美…

解决:ImportError: cannot import name ‘Sequence‘ from ‘collections‘

解决&#xff1a;ImportError: cannot import name ‘Sequence‘ from ‘collections‘ 背景 在使用之前的代码时&#xff0c;报错&#xff1a; File “G:\research\code\MicroDE_py\plot_bcic_iv_4_ecog_trial.py”, line 262, in from skorch.helper import predefined_spl…

适用于文件传输需求高,文件传输数据量大的aspera替代方案

与大多数点对点文件传输工具一样&#xff0c;Aspera提供了FTP和其他基于TCP的文件传输方法的可靠替代方案。 本文将主要介绍Aspera。但也要谈谈Aspera以及何时何地考虑将镭速作为Aspera替代方案。 Aspera的独特之处在于跨平台、WAN 优化文件传输的早期创新者。在这方面&#x…

11-22 SSM整合1

请求参数 (这里的形参数据都是SpringMvc注入的) controller里的方法不是我们来调用的 是由SpringMvc的前端控制器所调用的(前端控制器调用了处理器 由处理器和适配器去调用我们controller里的方法)&#xff0c;controller里的方法叫handler->处理器 SpringMVC的Controller方…

Pikachu(二)

CSRF (跨站请求伪造)概述 Cross-site request forgery 简称为“CSRF”&#xff0c;在CSRF的攻击场景中攻击者会伪造一个请求&#xff08;这个请求一般是一个链接&#xff09;&#xff0c;然后欺骗目标用户进行点击&#xff0c;用户一旦点击了这个请求&#xff0c;整个攻击就完…

JS数组常用的20种方法详解(每一个方法都有例子,超全面,超好理解的教程,干货满满)

目录 1.会改变原数组的方法&#xff08;7种&#xff09; 1.push() 2.pop() 3.unshift() 4.shift() 5.reverse() 6.sort() 7.splice() 2.不改变原数组的方法&#xff08;13种&#xff0c;返回的新数组是从原数组浅拷贝来的&#xff09; 1.concat() 2.join() 3.slice…

算法通关村第十二关-白银挑战字符串经典题目

大家好我是苏麟 , 今天带来字符串相关的题目 . 大纲 反转问题字符串反转K个一组反转仅仅反转字母反转字符串中的单词 反转问题 字符串反转 描述 : 编写一个函数&#xff0c;其作用是将输入的字符串反转过来。输入字符串以字符数组 s的形式给出。 题目 : LeetCode 344. 反转…

【MATLAB】全网入门快、免费获取、持续更新的科研绘图教程系列1

1 【MATLAB】科研绘图第一期点线图 %% Made by Lwcah %% 公众号&#xff1a;Lwcah %% 知乎、B站、小红书、抖音同名账号:Lwcah&#xff0c;感谢关注~ %% 更多MATLABSCI绘图教程敬请观看~%% 清除变量 clc; clear all; close all;%% 一幅图的时候figureWidth 8.5;figureHeight …

AI:87-基于深度学习的街景图像地理位置识别

🚀 本文选自专栏:人工智能领域200例教程专栏 从基础到实践,深入学习。无论你是初学者还是经验丰富的老手,对于本专栏案例和项目实践都有参考学习意义。 ✨✨✨ 每一个案例都附带有在本地跑过的代码,详细讲解供大家学习,希望可以帮到大家。欢迎订阅支持,正在不断更新中,…

VR云游:让旅游产业插上数字化翅膀,打造地方名片

自多地入冬降温以来&#xff0c;泡温泉成了许多人周末度假的选择&#xff0c;在气温持续走低的趋势下&#xff0c;温泉游也迎来了旺季&#xff1b;但是依旧有些地区温度依旧温暖&#xff0c;例如南京的梧桐美景也吸引了不少游客前去打卡&#xff0c;大家穿着汉服与金黄的树叶合…