【JavaEE多线程】Thread类及其常见方法(上)

系列文章目录

🌈座右铭🌈:人的一生这么长、你凭什么用短短的几年去衡量自己的一生!

💕个人主页:清灵白羽 漾情天殇_计算机底层原理,深度解析C++,自顶向下看Java-CSDN博客

❤️相关文章❤️:清灵白羽 漾情天殇-CSDN博客


目录

系列文章目录

前言

一、Thread构造方法

        1、Thread():

        2、Thread(Runnable target):

        拓展:

        1、Thread.sleep():

        2、sleep为什么要捕获异常:

        3、捕获异常之后呢?

        1、提供线程中断的机制

        2、保留中断状态

        3、提供了可靠的中断相应机制

        4、线程收到异常之后会做什么呢?

        1、恢复中断状态、        

        2、根据实际需求进行是当的清理工作

        补充

        3、Thread(Runnable target, String name)

二、其它方法


前言

        这篇文章我来为大家详细地介绍一下Thread类的常见的方法,以及线程的一些相关操作,当中包括如何中止线程、等待线程。


一、Thread构造方法

        在Java当中Thread类是用于创建和操作线程的主要类之一,Thread类的常见构造方法如下:

        1、Thread():

        这是Thread类的默认构造方法,他创建一个新的线程对象,但是如果我们不指定线程的执行任务,它将不会进行任何操作。

public class Main {
    public static void main(String[] args) {
        Thread thread = new Thread();
        thread.start();
    }
}

        2、Thread(Runnable target):

        这个构造方法接受一个实现了Runnable接口的对象作为参数,通过这样的方法我们可以在新线程当中执行实现了Runnable接口的对象的run()方法。

        Thread类是Java当中用于创建和管理线程的类,每个线程都是通过Thread类的实例表示的,Runnable接口是一个功能性接口,它只包含了一个抽象方法run(),当一个类实现了Runnable接口并且提供了run()方法的具体实现的时候,该类的实例就可以被传递给Thread类的构造方法,这个实现了Runnable接口的类通常包含了需要在新线程当中执行的代码。

        这个构造方法接受一个实现了Runnable接口的对象作为参数,当创建一个新的Thread实例的时候,可以通过这个构造方法指定该线程要执行的代码,而这段代码通常就是传递进来的RUnnable对象的run()方法。

        为什么要采用这样的方式呢,因为我们可以将不同的任务封装在实现了Runnable接口的类的实例当中,并且将这些任务交给Thread对象执行,从而实现多线程编程,这种方式比直接拓展Thread类更加灵活,因为一个类只能直接继承一个父类,但是可以实现多个接口,因此使用Runnable接口可以更好地支持代码的复用和组合。下面我为大家用代码来进行演示:

class MyTask implements Runnable{
    @Override
    public void run() {
        for (int i = 0;i < 5; i++){
            System.out.println("Thread running");
            try {
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                throw new RuntimeException(e);
            }
        }
    }
}
public class Main {
    public static void main(String[] args) {
        MyTask myTask = new MyTask();
        Thread thread = new Thread(myTask);
        thread.start();
        for (int i = 0;i < 5;i++){
            System.out.println("主线程正在执行");
            try {
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                throw new RuntimeException(e);
            }
        }
    }
}

        拓展:

        1、Thread.sleep():

        这个方法会让当前线程休眠指定的时间,所谓的当前线程是指调用这个sleep方法的线程,例如如果我们在main方法也就是主线程当中调用这个方法就是让主线程进入休眠,如果我们在自己定义的实现了Runnable接口的类当中调用了这个方法就是新的线程在休眠。

        2、sleep为什么要捕获异常:

        不仅仅是sleep()方法,Thread类当中几乎所有的方法都需要捕获异常,或者抛出异常来处理这个问题,包括我们后需要讲到的join(),wait()方法都需要这样做,那么这是为什么呢?这是因为在Java当中线程在休眠的时候是看可以被打断的,那么这个时候sleep就会发出'InterruptedException'异常来提醒线程已经被中断,因此在使用Thread.sleep()方法的时候需要处理这个异常,通常的做法是使用try-catch块进行环绕并进行相应的处理,比如恢复中断状态或者执行其它逻辑,在我为大家写的示例代码当中即使我们没有明确的中断线程的代码,但是为了保持良好的编码习惯,我们依然捕获了'InterruptedException'异常,这样做的好处是即使未来我们对线程进行了中断操作,代码也已经准备好了处理这种情况,提高了代码的健壮性和可维护性,有很多小伙伴在初学的时候不明白为什么这里一定要进行异常处理,希望我的观点可以帮助到大家。

        3、捕获异常之后呢?

        Thread这个类在设计的时候让Thread.sleep()抛出'InterruptedException'异常的主要目的是为了提供一种机制来响应线程的中断请求,Java中的线程中断机制允许一个线程中断另外一个线程的执行,当一个线程调用另一个线程的'interrupted'方法的时候,目标线程也就是被中断的线程就会收到一个中断请求,如果这个时候目标线程正在进行sleep(),wait(),join()方法当中休眠那么这个时候中断机制会将这个线程强制唤醒,并且唤醒之后收到一个'InterruptedException'异常信息。

        1、提供线程中断的机制

        通过抛出异常,允许线程在休眠期间被中断,使得线程可以在收到中断请求以后做出相应的处理,例如终止执行,清理资源等。

        2、保留中断状态

        当'InterruptedException'异常被捕获之后通常的做法是在catch块当中处理异常并且恢复线程中的中断状态,以便其它部分的代码可以检查到线程被中断,并且采取相应的行动。

        3、提供了可靠的中断相应机制

        通过抛出异常,确保了即使线程处于休眠状态,也能够及时响应中断请求(因为它会被立刻唤醒,这一点上面我们已经讲过了,这里就不再重复了),而不会无限地等待,这样可以使得多线程程序更加可靠和健壮。

        4、线程收到异常之后会做什么呢?

        1、恢复中断状态、        

        在catch块中使用‘Thread.currentThread().interrupt()’(这行代码我刚才的实例里面没有讲到,后面会为大家讲到。所以这里大家只做了解)来重新设置中断状态,以便其它部分的代码能够检查到线程是否被中断。

        2、根据实际需求进行是当的清理工作

        例如释放资源管理连接等,然后再根据业务的逻辑决定这个线程是否要继续执行,或者直接终止线程的执行不再被调用。

        补充

        我相信有很多小伙伴不太明白关于我上面讲到的关于恢复线程中断状态的概念,我在这里特别补充一下,线程中断状态是一个标志位,是线程TCB(线程控制块)内部自己维护的一个标志位用于表示线程是否被中断,当目标线程被中断的时候,中断状态就会被设置为true(初始状态为false),当线程在阻塞状态下(比如调用sleep、join等方法的时候)被中断的时候,会抛出'InterruptedException'异常,并且在抛出异常之前Java会清楚线程的中断状态,将中断状态重新设置为false,

        因此在处理这个异常的时候,通常需要更新设置线程的中断状态,以便将中断信息传递给更高层的调用栈,catch块当中的Thread.currentThread().interrupt()’会将线程的中断状态设置为之前的值,如果之前是true那么就设置为true如果之前是false亦然,在抛出异常之前清楚中断状态时为了让线程在异常处理之后继续执行,不会误认为被中断过,如果不清理中断状态,即使线程处理了’InterruptedException‘这个异常,但是在异常处理之后线程的中断状态仍然为true,我们要知道线程被中断一定会伴随着一系列的中断处理操作(这个我之前的文章里面有详细讲过这里就不一一介绍了)这样子的话会进行不必要的处理操作,所以在异常抛出之前就会清除中断状态保证异常是真正被中断的时候抛出,这是为了线程在异常处理之后能够正确地继续执行。

        我这里还要强调一点不要把清除中断状态和恢复中断状态搞混,清除中断状态是在抛出异常之前系统自动进行的,恢复中断状态是需要在catch块当中手动进行的,恢复中断状态是为了中断信息得以继续传递,通过清除线程的中断状态并且在适当的时候恢复它,使得线程可以在异常处理后继续执行,并且其他部分的代码可以根据需要处理中断请求。(这部分内容作为了解即可)

        3、Thread(Runnable target, String name)

        这里其实就是给线程起一个名字,内容很简单直接为大家用代码演示。

public class Main {
    public static void main(String[] args) {
        Runnable runnable = new Runnable() {
            @Override
            public void run() {
                for (int i = 0;i < 5;i++){
                    System.out.println(Thread.currentThread().getName()
                    + "running task");
                    try {
                        Thread.sleep(1000);
                    } catch (InterruptedException e) {
                        throw new RuntimeException(e);
                    }
                }
            }
        };

        Thread thread = new Thread(runnable,"Thread-1");
        Thread thread1 = new Thread(runnable,"Thread-2");
        thread1.start();
        thread.start();
    }
}

        Thread主要的几个构造方法就为大家介绍到这里,


二、其它方法

        后续的方法下一篇文章接着为大家介绍,希望这篇文章能够让你有所收获,我们明天再见!

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

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

相关文章

类和对象(中)(构造函数、析构函数和拷贝构造函数)

1.类的六个默认成员函数 任何类在什么都不写时&#xff0c;编译器会自动生成以下6个默认成员函数。 //空类 class Date{}; 默认成员函数&#xff1a;用户没有显示实现&#xff0c;编译器会自动生成的成员函数称为默认成员函数 2.构造函数 构造函数 是一个 特殊的成员函数&a…

接口自动化入门: Http请求的域名与IP地址概念!

在进行接口自动化测试时&#xff0c;经常需要与服务器进行通信&#xff0c;这就涉及到了使用Http协议发送请求。在发送请求时&#xff0c;我们需要指定目标服务器的域名或者IP地址。下面将从0到1详细介绍域名与IP地址的概念及其在接口自动化测试中的应用。 本文从5个方面来书写…

3D可视化技术:研发基地的科技新篇章

在科技日新月异的今天&#xff0c;我们生活在一个充满无限可能性的时代。而在这个时代中&#xff0c;3D可视化技术正以其独特的魅力&#xff0c;引领着科技领域的新一轮变革。 3D可视化技术通过三维图像的方式&#xff0c;将现实世界或虚拟世界中的物体、场景等以立体、逼真的形…

改进下记录学习的小网站

Strong改进 结束&#xff1a;2024-4-14 打算投入&#xff1a;10h 实际消耗&#xff1a;12h 3m 学习总是不在状态。 我的时间花得很零散&#xff0c;也有点茫然。所以想尝试一下集中式地、一块一块地花&#xff0c;比如投入30个小时&#xff0c;去干一件事&#xff0c;这样就可…

npm怎么迁移到pnpm

下载的vue3模板用到了pnpm&#xff0c;就安装了一下 但是安装之后使用pnpm install 就发现包全被移动到ignored文件夹下面了,还报错 PS G:\Projects\gitProeject\TS_front> pnpm installWARN  Moving commitlint/config-conventional that was installed by a different …

继电器会不会被淘汰?

继电器作为一种电控制器件&#xff0c;其基本功能是在输入量达到一定条件时&#xff0c;使电气输出电路中的被控量发生预定的阶跃变化。 尽管现代电子技术发展迅速&#xff0c;新型产品不断涌现&#xff0c;但继电器因其独特的优势在许多应用领域仍然不可替代。 技术优势&#…

git 删除本地分支 删除远程仓库中的分支

语法&#xff1a; 删除本地分支 git branch -D <分支名>删除远程分支 git push <remote名称> <分支名> --delete 示例&#xff1a; 删除本地分支 git branch -D feature/test_listview删除远程分支 git push origin feature/test_listview --delete 两个…

FebHost:谁可以注册.CA加拿大域名?

在加拿大&#xff0c;互联网域名的注册管理遵循一套独特的规则。特别是对于代表加拿大身份的顶级域名“.ca”&#xff0c;其申请和注册过程涉及一些严格的条件。这些条件确保了只有符合特定标准的个人或实体才能获得这一具有国家象征意义的网络地址。 首先&#xff0c;想要注册…

实战1-批量爬取百度图片(上)

任务需求&#xff1a;输入关键字下载100个图片保存到本地&#xff0c;每个关键字单独存放一个文件夹&#xff08;GUI版&#xff09; 任务描述&#xff1a;当输入关键字时会爬取100个与关键词有关的图片到本地每个关键词单独保存到一个文件夹中&#xff0c;比如说我输入黑客下载…

Arduino源代码(ino)在Proteus中调试总结

一、前言 基于BluePill Plus开发板&#xff08;该板是毕设网红板&#xff09; BluePill Plus / WeAct Studio 微行工作室 出品 BluePill-Plus/README-zh.md at master WeActStudio/BluePill-Plus GitHub 首页-WeAct Studio-淘宝网 (taobao.com) 在Proteus中对应的例子是&…

windows下安装kibana

下载&#xff1a;https://www.elastic.co/cn/downloads/kibana 安装&#xff1a;https://www.elastic.co/guide/cn/kibana/current/install.html 安装好后&#xff0c;cd到kibana的bin目录&#xff0c;启动kibana.bat 然后访问localhost:5601

链表(C语言)

前言&#xff1a;前面几篇文章我们详细介绍了顺序表&#xff0c;以及基于顺序表来实现的通讯录。今天我们连介绍一下链表的下一个结构链表。那么链表和顺序表究竟有什么区别呢&#xff1f;他们两个的优缺点分别是什么。今天这篇文章就带大家了解一下链表。 目录 一.链表的概念…

前端三大件速成 01 HTML

文章目录 一、前端基础知识二、标签1、什么是标签2、标签的属性3、常用标签&#xff08;1&#xff09;声明&#xff08;2&#xff09;注释&#xff08;3&#xff09;html 根标签&#xff08;3&#xff09;head标签&#xff08;4&#xff09;body标签 三、特殊字符四、其他标签1…

202462读书笔记|《一世珍藏的诗歌200首》——你曾经羞赧地向我问起, 是谁最早在此留下足印

202462读书笔记|《一世珍藏的诗歌200首》——你曾经羞赧地向我问起&#xff0c; 是谁最早在此留下足印 《一世珍藏的诗歌200首》作者金宏宇&#xff0c;很多美好的诗&#xff0c;有徐志摩&#xff0c;戴望舒&#xff0c;林徽因&#xff0c;舒婷等的诗精选&#xff0c;很值得一读…

变配电场所智能综合监控系统无人化与自动化升级改造

一 项目背景 国家电力建设飞速发展,为了提高管理水平,智能化建设迫在眉睫。变配电场所作为电网中的核心单元,数量巨大,是智能化建设的中坚部分。但由于变配电场所分布的地理位置过于分散&#xff0c;且配电网的自动化水平有待提高,单纯依靠人力来对变配电场所进行巡视,不仅增加…

Leo赠书活动-24期 【三大层次学习企业架构框架TOGAF】文末送书

✅作者简介&#xff1a;大家好&#xff0c;我是Leo&#xff0c;热爱Java后端开发者&#xff0c;一个想要与大家共同进步的男人&#x1f609;&#x1f609; &#x1f34e;个人主页&#xff1a;Leo的博客 &#x1f49e;当前专栏&#xff1a; 赠书活动专栏 ✨特色专栏&#xff1a;…

【网站项目】自习室预约系统

&#x1f64a;作者简介&#xff1a;拥有多年开发工作经验&#xff0c;分享技术代码帮助学生学习&#xff0c;独立完成自己的项目或者毕业设计。 代码可以私聊博主获取。&#x1f339;赠送计算机毕业设计600个选题excel文件&#xff0c;帮助大学选题。赠送开题报告模板&#xff…

基于Springboot+Vue的Java项目-企业客户管理系统开发实战(附演示视频+源码+LW)

大家好&#xff01;我是程序员一帆&#xff0c;感谢您阅读本文&#xff0c;欢迎一键三连哦。 &#x1f49e;当前专栏&#xff1a;Java毕业设计 精彩专栏推荐&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb; &#x1f380; Python毕业设计 &am…

【Python】OPC UA模拟服务器实现

目录 服务器模拟1. 环境准备2. 服务器设置3. 服务器初始化4. 节点操作5. 读取CSV文件6. 运行服务器 查看服务器客户端总结 在工业自动化和物联网&#xff08;IoT&#xff09;领域&#xff0c;OPC UA&#xff08;开放平台通信统一架构&#xff09;已经成为一种广泛采用的数据交换…

如何使用Docker部署WPS Office服务并实现无公网IP远程处理文档表格

文章目录 1. 拉取WPS Office镜像2. 运行WPS Office镜像容器3. 本地访问WPS Office4. 群晖安装Cpolar5. 配置WPS Office远程地址6. 远程访问WPS Office小结 7. 固定公网地址 wps-office是一个在Linux服务器上部署WPS Office的镜像。它基于WPS Office的Linux版本&#xff0c;通过…
最新文章