Thread类及常见方法

news2024/11/26 15:24:20

在这里插入图片描述

文章目录

  • 一、Thread常见构造方法
  • 二、Thread常见属性
  • 三、Thread常见方法
    • start()
    • 获取当前线程
    • 休眠当前线程
    • 中断线程
    • join()

一、Thread常见构造方法

Thread类是JVM用来管理线程的一个类,每个线程都有唯一一个Thread对象与之对应,JVM会将这些对象组织起来,线程调度,线程管理。
在这里插入图片描述

方法说明
Thread()创建线程对象
Thread(Runnable target使用Runnable对象创建线程对象
Thread(String name)创建线程对象,并命名
Thread(Runnable target,String name)使用Runnable对象创建线程,并命名

我们在创建Thread的对象为什么要命名?方便我们查看信息和调试。
在这里插入图片描述
线程默认名叫做Thread-0, Thread-1等等,当线程比较多的时候,很难分辨线程,所以我们可以命名。

二、Thread常见属性

属性获取方法
IDgetId()
名称getName()
状态getState()
优先级getPriority()
是否有后台线程isDaemon()
是否存活isAlive()
是否被中断isInterrupted()

getId(): ID是线程的唯一标识,不同的线程不重复

class MyThread extends Thread{
    @Override
    public void run() {
        System.out.println("Hello world!");
    }
}
public class ThreadDemo {
    public static void main(String[] args) {
        Thread t = new MyThread();
        System.out.println(t.getId());

    }
}

在这里插入图片描述

getName: 名称是我们构造方法设置的名称,如果没有设置,那就是默认名。

public static void main(String[] args) {
        Thread t = new MyThread();
        System.out.println(t.getName());
    }

在这里插入图片描述
因为我们没有命名,所以使用的是默认名。
getState(): 指的是当前线程所处的状态 ( java当中的线程状态比操作系统中的状态更丰富,分的更细 ).

public static void main(String[] args) {
        Thread t = new MyThread();
        System.out.println(t.getState());
    }

在这里插入图片描述
这里NEW状态 (指的是线程对象已创建,但操作系统还没有为其分配PCB) 是什么大家先不用管,后面我们会详细介绍,只需要知道getState()方法是用来查看线程状态的。
getPriority: 我们可以获取当前线程的优先级,但没有太大的用,实际还得取决于操作系统内核的具体调度。

public static void main(String[] args) {
        Thread t = new MyThread();
        System.out.println(t.getPriority());
    }

在这里插入图片描述
isDaemon(): 是否为守护线程(也叫后台线程), 简单的理解一下,我们手动创建的线程都是前台线程,JVM自带的线程都是后台线程,我们也可以通过setDaemon()方法将前台线程设置为后台线程。
在这里插入图片描述

public static void main(String[] args) {
        Thread t = new MyThread();
        System.out.println(t.isDaemon());
    }

在这里插入图片描述
isAlive(): 线程的run方法是否执行结束。
在这里插入图片描述

如果我们只创建了一个t变量,我们并没有在操作系统内核里有线程,只是把我们线程执行的任务梳理好了
在这里插入图片描述
当我们执行了start()方法后,就会让内核创建一个PCB,此时这个PCB才表示一个真正的线程。
调用start()方法之前,isAlive()是false
调用start()方法之后,run()方法未执行完,isAlive()为false.

public static void main(String[] args) {
        Thread t = new MyThread();
        System.out.println(t.isAlive());
        t.start();
        System.out.println(t.isAlive());
    }

在这里插入图片描述

**isInterrupt(): ** 线程中断问题
这两个方法我们后面会进一步说明。

三、Thread常见方法

start()

start() 启动一个线程。

class MyThread extends Thread{
    @Override
    public void run() {
        System.out.println("Hello world!");
    }
}
public class ThreadDemo {
    public static void main(String[] args) {
        Thread t = new MyThread();
        t.start();
    }

在这里插入图片描述
run()方法提供线程要做的事情的指令清单。
在这里插入图片描述
这是创建t对象,只是知道要找那样的线程做什么事
在这里插入图片描述
只有当start(),操作系统内核才会创建一个真真正正的线程PCB,然后去调用run()方法。

获取当前线程

方法说明
currentThread()获取当前线程对象的引用

在这里插入图片描述
我们可以发现currentThread()方法是Thread类下的一个静态方法,所以我们直接使用类名调用即可。

休眠当前线程

方法说明
sleep(long millis)休眠当前线程millis毫秒

由于线程调度是不可控的,我们sleep()方法的实际休眠是大于等于设置的时间的。

在这里插入图片描述
我们的sleep方法也是Thread下的静态方法,直接类名调用即可。
需要注意的是我们在那个线程下面调用该方法,那个线程休眠。
在这里插入图片描述
使用sleep时会有一个中断异常(非受查异常),需要我们手动抛出。

public static void main(String[] args) throws InterruptedException {
        System.out.println(System.currentTimeMillis());
        Thread.sleep(1000);
        System.out.println(System.currentTimeMillis());
    }

我们直接在主线程演示一下该方法。
在这里插入图片描述

中断线程

线程中断: 我们这里的中断,并不是线程立即就结束了,而是通知该线程,你应该结束了,但实际是否结束,取决于线程里具体的代码。
1.使用标志位来控制线程是否结束

public class ThreadDemo {
    private static boolean flg = true;

    public static void main(String[] args) throws InterruptedException {
        Thread t = new Thread(() -> {
            while (flg) {
                System.out.println("My Thread!");
                try {
                    Thread.sleep(1000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        });
        t.start();
        Thread.sleep(3000);
        flg = false;
    }
}    

在这里插入图片描述
在这里插入图片描述
我们这个代码之所以能够起到修改flg就使线程结束,完全取决于线程内部的代码书写,我们只能起到一个通知作用,至于是否结束,还是取决于线程内部,即使我们sleep正在休眠,我们的标志位也可以唤醒sleep。

2. 调用 interrupt() 方法来通知

public static void main(String[] args) throws InterruptedException {
        Thread t = new Thread(() -> {
            while (!Thread.currentThread().isInterrupted()) {
                System.out.println("My Thread!");
                try {
                    Thread.sleep(1000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        });
        t.start();
        Thread.sleep(3000);
        t.interrupt();
    }

在这里插入图片描述
在这里插入图片描述
我们可以发现我们的代码触发了异常。
在这里插入图片描述
在唤醒sleep之后,我们的线程还在一直执行
在这里插入图片描述
interrupt()方法会做两件事:
1.把线程内部的标志位设置为true
2.如果线程正在sleep,会触发异常,将sleep唤醒。
sleep唤醒的同时,会清空标志位,将刚才设置的标志位在设置为false(这就导致,我们的循环会继续执行).
如果我们想去中断,我们可以在异常里加一个break。当我们sleep被唤醒时,结束run()方法。
在这里插入图片描述
在这里插入图片描述

这里再一次证明了,这里的中断只是通知线程,至于是否执行还得看线程内部的代码。

join()

join(): 等待一个线程
因为我们线程是随即调度的过程,线程的执行顺便我们无法把控,但在一些场景下我们需要有明确的线程程序顺序,等待线程,就是可以控制两个线程的结束顺序。

方法说明
join()等待线程结束
join(long millis)等待线程结束,最多等millis毫秒
public static void main(String[] args) throws InterruptedException {
        Thread t = new Thread(() -> {
            for (int i = 0; i < 3; i++) {
                System.out.println("My Thread!");
            }
        });
        t.start();
        System.out.println("Main!");
    }

在这里插入图片描述
我们想让t线程先执行完,再去打印Main!

public static void main(String[] args) throws InterruptedException {
        Thread t = new Thread(() -> {
            for (int i = 0; i < 3; i++) {
                System.out.println("My Thread!");
            }
        });
        t.start();
        t.join();
        System.out.println("Main!");
    }

在这里插入图片描述
我们在主线程调用了下join()方法。
在这里插入图片描述

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

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

相关文章

世界杯征文活动 | 神奇!一段JavaScript代码生成会动的足球

世界杯征文活动 | 神奇&#xff01;一段JavaScript代码生成会动的足球 文章目录前言一、效果展示二、代码解析1.把足球图片转换为base64格式2.根据base64格式的字符串&#xff0c;创建img标签图片对象3.创建存放图片img的div标签对象4.使div旋转起来总结前言 花有重开日&#…

python中的import详解

0. 什么是导入&#xff1f; 导入从本质上讲&#xff0c;就是载入另一个文件&#xff0c;并能够读取那个文件的内容 0.1 模块和属性 模块往往就是变量名的封装&#xff0c;被认作是命名空间属性就是绑定在特定对象上的变量名 0.2 from和import 通过import得到了具有属性的模…

697226-52-1, 细胞穿膜肽TAT-amide

TAT-amide 是一种细胞穿透肽。细胞穿透肽 (CPPs) 是能够进入不同细胞的短氨基酸序列&#xff0c;用于细胞的物质细胞递送。TAT-amide is a cell penetrating peptide. Cell-penetrating peptides (CPPs) are short amino acid sequences able to enter different cells[1][2]. …

软件测试工程师应该学Python还是学Java?

前言 对于一个软件测试工程师来说&#xff0c;选哪一门语言来入手编程一直是件非常纠结的事情&#xff0c;当然立志做一辈子功能测试的人除外。 当你学完软件测试基本理论&#xff0c;掌握业务测试流程&#xff0c;功能测试可以搞定&#xff0c;数据库和linux玩的也很溜时&am…

Day822.Happens-Before 规则 -Java 并发编程实战

Happens-Before 规则 Hi&#xff0c;我是阿昌&#xff0c;今天学习记录的是关于Happens-Before 规则的内容。 可见性、原子性、有序性这三者在编程领域属于共性问题&#xff0c;所有的编程语言都会遇到&#xff0c;Java 在诞生之初就支持多线程&#xff0c;自然也有针对这三者…

Blender 雕刻

文章目录简介.基本操作.进入雕刻.雕刻工作区.动态拓扑.动态拓扑属性.重构网格.物体数据属性重构网格.雕刻自带的重构网格.简介. 1 雕刻的本质是是用笔刷对顶点进行移动 2 被雕刻的物体要有足够多的顶点才行&#xff0c;可以使用动态拓扑解决顶点不够的问题 基本操作. 进入雕…

你猜,怎么用一句话证明你是项目经理?

早上好&#xff0c;我是老原。 熟悉我的老朋友都知道&#xff0c;我有两大爱好&#xff0c;一是钟情于挖招聘JD&#xff0c;二是喜欢逛知乎。 今天在知乎上看到一个很有趣的话题&#xff1a;你如何用一句话证明你是项目经理&#xff1f; 项目管理发展至今&#xff0c;有技术/…

JavaScript大作业(餐厅美食网站设计与实现)

&#x1f380; 精彩专栏推荐&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb; ✍️ 作者简介: 一个热爱把逻辑思维转变为代码的技术博主 &#x1f482; 作者主页: 【主页——&#x1f680;获取更多优质源码】 &#x1f393; web前端期末大作业…

【CBAM||目标识别||注意力机制||gated卷积】Convolutional Block Attention Module

这篇是2018年的paper&#xff0c;已经有很多中文资料可以学习&#xff0c;因而不做重复工作~记录一下核心要点&#xff0c;后续可阅。【学习资源】CBAM&#xff1a;卷积注意力机制模块 【学习资源】论文阅读-CBAM: Convolutional Block Attention Module CBMA:卷积注意力机制模…

10K起步的软件测试岗到底需要学什么?零基础进阶自动化测试需要哪些技术...

软件测试的正确路线 1、软件测试基础&#xff1a; 对软件测试整理的测试流程有清晰的概念&#xff0c;了解软件测试到底是做什么的&#xff0c;软件测试的各种专业术语是什么意思&#xff0c;以及多种不同的软件测试类型区分&#xff0c;测试用例的作用、本质以及如何撰写&…

开关电源环路稳定性分析(2)-从开环到闭环

大家好&#xff0c;这里是大话硬件。 在上一节中&#xff0c;基于欧姆定律&#xff0c;基尔霍夫定律&#xff0c;伏秒平衡这些已知的知识点&#xff0c;可以推导出Buck变换器的输入输出关系。 今天这一节&#xff0c;我们还是从全局的概念来解析开关电源。 1. 运放和开关电源…

盘点世界杯有趣小知识!带你感受体育赛事数据可视化的快乐!

2022年卡塔尔世界杯是第二十二届世界杯足球赛&#xff0c;是历史上首次在卡塔尔和中东国家境内举行、也是第二次在亚洲举行的世界杯足球赛。 今年卡塔尔世界杯可谓精彩纷呈&#xff0c;花2000个亿在沙漠里打造出的空调球场、洗脑又魔性的“母鸡生蛋”主题曲《Tukoh Taka》、世界…

角逐「视觉感知」万亿市场,这家国内领跑者如何挑战性能天花板?

随着智能汽车渗透率快速提升&#xff0c;车用视觉感知摄像头装配量大幅增长。以前向ADAS摄像头为例&#xff0c;今年1-8月中国市场&#xff08;不含进出口&#xff09;乘用车新车标配交付为639.10万颗&#xff0c;同比增长29.54%&#xff1b;而这个数字在2021年同期为55.67%。 …

ppt 的基本操作1

一 基本操作 1.1 隐藏和显示功能区 1.点击有上角&#xff0c;小箭头标志 2.显示 1.2 工作区 和编辑区的比例拖放 1.1 箭头放到红色标注的部分&#xff0c;当鼠标变为箭头形状&#xff0c;可以动态拖动 2.可以看到二者之间的比例&#xff0c;发生变化 1.3 编辑区设置网格线…

Minianaconda安装jupyter notebook遇到的问题及解决

文章目录前言一、如何安装jupyter notebook二、其他问题解决1、安装时报错2、安装之后不能打开3、Verifying transaction: failedRemoveError注意&#xff1a;使用时命令提示符窗口不可以关闭前言 提示&#xff1a;这里可以总结遇到的各种问题&#xff1a; 1、如何安装jupyte…

Excel 可视化教程之可视化的科学与艺术

我们经常对表示数据的方式感到不知所措,所以这里是关于为什么要进行可视化以及在进行可视化时的基本思考过程。 探索性与解释性 原始格式的数据既不美观也不具有洞察力。为了掌握潜在的分布、异常和洞察力,我们需要进行探索性数据分析,通常称为 EDA。因此,数据的探索部分…

MySQL表的操作

文章目录MySQL表的操作创建表创建表案例查看表结构修改表删除表MySQL表的操作 表操作至少会涉及如下两类SQL语句&#xff1a; DDL&#xff08;Data Definition Language&#xff09;数据定义语言&#xff1a;比如建表、删表、该表、新增列、删除列等。DML&#xff08;Data Ma…

电容笔有什么用?电容笔10大品牌排行榜

当电容笔与ipad配合使用时&#xff0c;将会极大地提高我们的工作以及学习效率&#xff0c;同时增加更多的乐趣&#xff0c;而不会让人觉得枯燥。在画画方面&#xff0c;电容笔的重要作用不可忽略。我对电容笔还是很了解的&#xff0c;很多电容笔都是适用于我们的ipad的&#xf…

故障分析 | OceanBase Proxy 无法连接 OBserver 集群

作者&#xff1a;贲绍华 爱可生研发中心工程师&#xff0c;负责项目的需求与维护工作。其他身份&#xff1a;柯基铲屎官。 本文来源&#xff1a;原创投稿 *爱可生开源社区出品&#xff0c;原创内容未经授权不得随意使用&#xff0c;转载请联系小编并注明来源。 一、问题现象&am…

前端一面经典vue面试题(持续更新中)

vuex是什么&#xff1f;怎么使用&#xff1f;哪种功能场景使用它&#xff1f; Vuex 是一个专为 Vue.js 应用程序开发的状态管理模式。vuex 就是一个仓库&#xff0c;仓库里放了很多对象。其中 state 就是数据源存放地&#xff0c;对应于一般 vue 对象里面的 data 里面存放的数据…