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

这篇具有很好参考价值的文章主要介绍了【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);
            }
        }
    }
}

【JavaEE多线程】Thread类及其常见方法(上),自顶向下看Java,java-ee,java

        拓展:

        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主要的几个构造方法就为大家介绍到这里,


二、其它方法

        后续的方法下一篇文章接着为大家介绍,希望这篇文章能够让你有所收获,我们明天再见!文章来源地址https://www.toymoban.com/news/detail-855259.html

到了这里,关于【JavaEE多线程】Thread类及其常见方法(上)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 计算机网络——自顶向下方法(第四章学习记录)

    本章学习网络层:数据平面 前一章中我们学习了运输层依赖于网络层的主机到主机的通信服务,提供了各种形式的进程到进程的通信。在本章中我们将看到与运输层和应用层不同的是,在网络中的每一台主机和路由器中都有一个网络层部分。 网络层能够被分解为两个相互作

    2024年02月11日
    浏览(53)
  • 计算机网络——自顶向下方法(第二章学习记录)

    本章学习应用层 网络应用是计算机网络存在的理由。 现代网络应用程序有两种主流体系结构:客户—服务器体系结构和对等(P2P)体系结构 客户—服务器体系结构 (client-server ),在这个结构中,有一个总是打开的主机称为服务器,它服务于来自许多其他称为客户的主机的请求

    2024年02月09日
    浏览(42)
  • 计算机网络——自顶向下方法(第一章学习记录)

    可以从两个不同的方面来理解Internet。(它的构成。它的服务) 1.因特网的主要构成          处在因特网的边缘部分就是在因特网上的所有主机,这些主机又称为 端系统 (end system),端系统通过 因特网服务提供商 (Internet Service Provider,ISP)接入因特网,端系统通过 通信

    2024年02月10日
    浏览(41)
  • 计算机网络——自顶向下方法(第三章学习记录)

    本章学习运输层 运输层位于应用层和网络层之间,是分层的网络体系的重要部分,该层为运行在不同主机上的应用进程提供直接的通信服务起着至关重要的作用。 运输层协议为运行在不同主机上的应用进程之间提供了 逻辑通信 (logic communication)功能。从应用程序的角度看,通

    2024年02月11日
    浏览(40)
  • 《计算机网络——自顶向下方法》精炼——1.4到1.7

    三更灯火五更鸡,努力学习永不止。无惧困难与挑战,砥砺前行向成功。 计算机网络在这一学科中的重要性毋庸置疑,而黑皮书又是这一学科的教科书级经典,因此本书是计算机从业者的必读书之一。笔者用一个专栏来精炼这本书的知识,帮助想了解这方面知识的同学快速打

    2023年04月15日
    浏览(33)
  • 《计算机网络:自顶向下方法》学习笔记——第六章:链路层

    两种截然不同类型的链路层信道 广播信道 :这种信道用于连接有线局域网、卫星网和混合光纤同轴电缆接入网中的多台主机。 点对点通信链路 :这在诸如长距离链路连接的两台路由器之间,或用户办公室计算机与它们所连接的邻近以太网交换机之间等场合经常能够发现。

    2024年02月03日
    浏览(39)
  • 《计算机网络:自顶向下方法》第五章--网络层:控制平面

    控制平面作为一种网络范围的逻辑,不仅控制沿着从源主机到目的主机的端到端路径间的路由器如何转发数据报,而且控制网络层组件和服务如何配置和管理 传统上,控制平面功能与数据平面的转发功能在一起实现,在路由器中作为统一的整体 在网络层:数据平面中有转发

    2024年02月12日
    浏览(50)
  • 【计算机网络-自顶向下方法】应用层(HTTP、FTP)

    1. Principles of network applications 创建一个网络应用   创建一个网络应用的核心,是编写一个分布式程序,使其可以运行在不同的端系统上,并能通过网络相互通信。(例如,web服务器软件与浏览器软件)   应用程序只运行在终端上(只在端系统上开发应用),应用程序员不

    2024年02月08日
    浏览(44)
  • 《计算机网络--自顶向下方法》第四章--网络层:数据平面

    每台路由器的数据平面的主要作用是从其输入链路向其输出链路转发数据报 ;控制平面的主要作用是协调这些本地路由器转发动作,使得数据报沿着源和目的地主机之间的路由器路径进行端到端传送 路由器具有截断的协议栈,即没有网络层之上的部分,因为 路由器不运行应

    2024年02月12日
    浏览(43)
  • 《计算机网络——自顶向下方法》精炼——2.2.3-2.2.5

    “Education is not the filling of a pail, but the lighting of a fire.” - William Butler Yeats 计算机网络在这一学科中的重要性毋庸置疑,而黑皮书又是这一学科的教科书级经典,因此本书是计算机从业者的必读书之一。笔者用一个专栏来精炼这本书的知识,帮助想了解这方面知识的同学快速打

    2023年04月27日
    浏览(31)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包