Java多线程:`Thread`类

在这里插入图片描述

  • 👑专栏内容:Java
  • ⛪个人主页:子夜的星的主页
  • 💕座右铭:前路未远,步履不停

目录

  • 一、`Thread`的常见构造方法
  • 二、`Thread` 的常见属性
  • 三、`Thread`的常用方法
    • 1、`start`方法
    • 2、中断一个线程
      • Ⅰ、通过共享标记
      • Ⅱ、调用`interrupt()` 方法
    • 3、等待一个线程
    • 4、休眠当前线程


前面用了这么多次Thread类,下面我们就来详细的看看Thread类里面到底有什么。

Thread类在Java中是用于管理线程的关键类,换句话说,每个线程都与一个唯一的Thread对象相关联。以我们上面的例子为例,每个执行流都需要有一个对象来描述。

Thread类的对象就是用来描述一个线程执行流的,JVM会将这些Thread对象组织起来,用于线程调度和管理。

在这里插入图片描述

一、Thread的常见构造方法

方法签名说明
Thread()创建线程对象
Thread(Runnable target)使用 Runnable 对象创建线程对象
Thread(String name)创建线程对象,并命名
Thread(Runnable target, String name)使用 Runnable 对象创建线程对象,并命名
Thread(ThreadGroup group, Runnable target)线程可以被用来分组管理,分好的组即为线程组。了解即可。
Thread t1 = new Thread();
Thread t2 = new Thread(new MyRunnable());
Thread t3 = new Thread("这是我的名字");
Thread t4 = new Thread(new MyRunnable(), "这是我的名字");

在这里插入图片描述

   public static void main(String[] args) {
        Thread thread = new Thread(()->{
            while(true){
                System.out.println("这是线程运行代码!");
            }
        },"myThread");
        thread.start();
    }

这是用上面的构造方法新建的线程,并且命名为:myThread

我们运行后,打开自己jkdbin目录。

在这里插入图片描述
连接这个正在运行的类。点击线程,就看有看见这个被我们命名的线程正在运行。

在这里插入图片描述

图片描述

因为main方法已经执行完了。

在这里插入图片描述

二、Thread 的常见属性

属性获取方法说明注意
IDgetId()获取线程的唯一标识符不同线程的ID不会重复
名称getName()获取线程的名称调试工具常用
状态getState()获取线程的当前状态状态表示线程当前所处的情况
优先级getPriority()获取线程的优先级优先级高的线程理论上更容易被调度到
是否后台线程isDaemon()检查线程是否为后台线程JVM会在所有非后台线程结束后才结束运行
是否存活isAlive()检查线程是否存活简单理解为run方法是否运行结束
是否被中断isInterrupted()检查线程是否被中断后面再聊

主要说一下后台线程和前台线程。

在Java中,线程可以分为两种类型:前台线程(也称为用户线程)和后台线程(也称为守护线程)。这两种线程之间有一些关键的区别:

  1. 前台线程(用户线程):

    • 当Java程序启动时,默认情况下创建的线程都是前台线程。
    • 前台线程的执行不会影响程序的结束。即使所有的前台线程执行完毕,程序仍然会继续运行,直到main方法完成。
    • 主要用于执行程序的核心功能,它们的结束可能导致程序的结束。
  2. 后台线程(守护线程):

    • 后台线程是通过setDaemon(true)方法设置的,它告诉JVM这个线程是一个后台线程。
    • 当所有的前台线程执行完毕,无论后台线程是否执行完毕,JVM都会终止程序,即JVM在结束时会等待所有的前台线程执行完毕,但不会等待后台线程。
    • 后台线程通常用于执行一些支持性工作,例如垃圾回收、定期任务等。

在Java中,通过setDaemon(true)方法将线程设置为后台线程:

    public static void main(String[] args) {
        Thread thread = new Thread(() -> {
            while(true){
                System.out.println("hello thread!");
            }
        });
        //设置成后台线程
        thread.setDaemon(true);
        thread.start();
    }

需要注意的是,一旦线程启动,就无法将其设置为或从后台线程切换回前台线程。因此,设置线程为后台线程应在启动线程之前完成。

三、Thread的常用方法

1、start方法

start方法是用于在系统中创建真正的线程。

该方法的调用实际上是调用系统的API完成线程的创建工作。start方法本身的执行是瞬时完成的,它仅仅是告诉系统你要创建一个线程。一旦start被调用,代码会立即继续执行start后续的逻辑。在这个过程中,系统会异步地执行新线程的run方法,使得新线程可以并行运行。

在这里插入图片描述
操作系统 = 内核 + 配套的程序。

内核是一个系统最核心的功能:对下管理好硬件设备,对上给各种程序提供稳定运行环境。

2、中断一个线程

中断一个线程目前常见的有以下两种方式:

  1. 通过共享的标记来进行沟通
  2. 调用 interrupt() 方法来通知

Ⅰ、通过共享标记

通过共享的标记的这种方法是在线程之间共享一个标志(一个布尔变量),线程定期检查这个标志以决定是否应该停止执行。

public class SharedFlagExample implements Runnable {
    private volatile boolean running = true;

    public void run() {
        while (running) {
            // 执行线程的操作
        }
    }

    public void stopRunning() {
        running = false;
    }
}

running 是一个共享的标志。当需要停止线程时,调用 stopRunning 方法将 running 设置为 false,线程将在下一次循环时停止执行。

Ⅱ、调用interrupt() 方法

public class InterruptExample implements Runnable {

    public void run() {
        try {
            // 执行可能会被中断的操作
            while (!Thread.currentThread().isInterrupted()) {
                // ...
            }
        } catch (InterruptedException e) {
            // 处理中断异常
        } finally {
            // 清理工作
        }
    }
}

注意事项

  • 使用 interrupt() 方法中断线程时,目标线程不一定会在收到中断信号后立即停止执行。
  • 线程应该在适当的时候检查中断标志,并在必要时进行清理工作。
  • 不建议使用 Thread.stop() 方法来中断线程,因为它可能会导致线程资源泄漏等问题。

3、等待一个线程

等待线程是指让当前线程进入阻塞状态,直到满足特定条件后再继续执行。
Java 提供了多种方法来实现线程等待,包括:

wait() 方法:用于让当前线程等待另一个线程对其进行唤醒。
join() 方法:用于让当前线程等待另一个线程终止。
sleep() 方法:用于让当前线程休眠指定的时间。

public class WaitExample {

    public static void main(String[] args) throws InterruptedException {
        Thread thread1 = new Thread(() -> {
            synchronized (WaitExample.class) {
                try {
                    WaitExample.class.wait();
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
            System.out.println("Thread 1 is awake!");
        });

        thread1.start();

        Thread.sleep(1000);

        synchronized (WaitExample.class) {
            WaitExample.class.notify();
        }
    }
}

4、休眠当前线程

休眠当前线程是指让当前线程进入阻塞状态,并等待指定的时间后再继续执行。Java 提供了 Thread.sleep() 方法来实现线程休眠。

public class SleepExample {

    public static void main(String[] args) throws InterruptedException {
        System.out.println("Thread 开始");
        Thread.sleep(1000);
        System.out.println("Thread 结束");
    }
}

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

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

相关文章

大模型基础架构的变革:剖析Transformer的挑战者(下)

上一篇文章中,我们介绍了UniRepLKNet、StripedHyena、PanGu-π等有可能会替代Transformer的模型架构,这一篇文章我们将要介绍另外三个有可能会替代Transformer的模型架构,它们分别是StreamingLLM、SeTformer、Lightning Attention-2&#xff…

蓝桥杯省赛模板构建——uart

打开CubeMX 串口的发送是跟调试器放一起的,通过PA9和PA10来接收发送 选择异步通讯 波特率配置为9600 打开串口中断,因为单片机接收数据需要用到中断 生成代码 添加底层驱动代码 打开在main.h打开uart定义 uart时钟配置,由于uart是用PCLK时钟…

STM32的ADC电压采集

时间记录:2024/2/9 一、ADC相关知识点 (1)STM32的ADC时钟不要超过14MHz,不然结果的准确率将下降 (2)ADC分为规则组和注入组,规则组相当于正常运行的程序,注入组相当于中断可以打断…

飞天使-linux操作的一些技巧与知识点8-zabbix6.0 容器搭建

文章目录 安装docker安装步骤mysql下载镜像安装zabbix 使用zabbix非host模式创建 测试效果 安装docker 1. 配置官方 yum 源$ sudo yum install -y yum-utils $ sudo yum-config-manager \--add-repo \https://download.docker.com/linux/centos/docker-ce.repo2. 安装 Docker$ …

CSGO游戏搬砖项目靠谱吗?是不是骗人的

很多地方都在大肆宣扬说CSGO游戏搬砖项目有二三十个点的利润,但我觉得他们看待问题太片面了,没有从全局上去分析这个项目。 这些人为了能割到小白的韭菜真是无所不用其极,什么牛都能吹得出来!至少要实事求是吧,这不睁…

应用ANN+SMOTE+Keras Tuner算法进行信用卡交易欺诈侦测

目录 SMOTE: ANN:ANN(MLP) 三种预测-CSDN博客 Keras Tuner:CNN应用Keras Tuner寻找最佳Hidden Layers层数和神经元数量-CSDN博客 数据: 建模: SMOTE Sampling: Keras Tuner: SMOTE&…

【洛谷题解】B2056 求整数的和与均值

题目链接:求整数的和与均值 - 洛谷 题目难度:入门 涉及知识点:求和,平均值 题意: 输入样例: 4 344 222 343 222 输出样例: 1131 282.75000 分析:直接累加,再求平…

【Boost】:http_server模块(六)

http_server模块 一.安装cpp-httplib库二.基本使用服务器 一.安装cpp-httplib库 可以自己写一个http服务器,但比较麻烦,这里直接使用库。 在gitee上搜索cpp-httplib,任意找一个即可(建议使用0.7.15版本)。例如&#xf…

双重OSPF + OSPF综合实验

一、实验要求 1.R4为ISP,所连接的所有物理接口为公有网段,任意指定IP即可。 2.R1-2-3 构建一个星型结构的MGRE结构,其中R1为中心点,假设R1的公有IP为固定地址。 3.R1-5-6 构建另一个全连网状的MGRE网络,其中R1/5均为中…

STM32输出PWM波控制180°舵机

时间记录:2024/2/8 一、PWM介绍 (1)脉冲宽度调制 (2)占空比:高电平时间占整个周期时间的比例 (3)STM32通过定时器实现PWM时具有两种模式 PWM1模式:向上计数模式下&…

【错误收录】ohpm ERROR: Install failed FetchPackageInfo: @ohos/hypium failed

创建APP的时候出现这样一个错误,是代理没有配置的原因 ohpm.bat install --registry https://repo.harmonyos.com/ohpm/ ohpm WARN: ETIMEDOUT Failed to search for package "ohos/hypium" from "https://repo.harmonyos.com/ohpm/", request…

【初中生讲机器学习】6. 分类算法中常用的模型评价指标有哪些?here!

创建时间:2024-02-07 最后编辑时间:2024-02-09 作者:Geeker_LStar 你好呀~这里是 Geeker_LStar 的人工智能学习专栏,很高兴遇见你~ 我是 Geeker_LStar,一名初三学生,热爱计算机和数学,我们一起加…

【Java IO】同步异步和阻塞非阻塞真正的区别!!!

先上结论: 同步异步和阻塞非阻塞真正的区别!!! 假设某个进程正在运行下面这段代码: ...... operatorA......; read(); operatorB......; operatorC......;当进程执行完operatorA后开始进行read系统调用,…

[word] word2019段落中创建纵横混排的方法图解教程 #知识分享#其他#职场发展

word2019段落中创建纵横混排的方法图解教程 有时候在word文档中需要让文字纵横混排,word2019正好为我们带来了纵横混排的功能了,今天我们就来给大家介绍一下word2019段落中创建纵横混排的方法。 步骤1:打开Word文档,选中需要纵向…

单片机学习笔记---蜂鸣器工作原理

目录 蜂鸣器介绍 蜂鸣器的驱动方式 ULN2003D芯片工作原理 实战预备知识:基础乐理 音名的分组 全音和半音的关系 音高的表示 五线谱中的符号定义 简谱上的符号定义 C调音符与频率对照表 相关计算 蜂鸣器介绍 蜂鸣器是一种将电信号转换为声音信号的器件&a…

【SpringBootStarter】自定义全局加解密组件

【SpringBootStarter】 目的 了解SpringBoot Starter相关概念以及开发流程实现自定义SpringBoot Starter(全局加解密)了解测试流程优化 最终引用的效果&#xff1a; <dependency><groupId>com.xbhog</groupId><artifactId>globalValidation-spring…

2.7日学习打卡----初学RabbitMQ(二)

2.7日学习打卡 JMS 由于MQ产品很多&#xff0c;操作方式各有不同&#xff0c;于是JAVA提供了一套规则 ——JMS&#xff0c;用于操作消息中间件。JMS即Java消息服务 &#xff08;JavaMessage Service&#xff09;应用程序接口&#xff0c;是一个Java平台中关于面 向消息中间件的…

数据结构-->线性表-->单链表

链表的定义 链表&#xff1a;链表是一种物理存储结构上非连续、非顺序的存储结构&#xff0c;数据元素的逻辑顺序是通过链表中的指针链接次序实现的。 与顺序表不同的是&#xff0c;链表里的每节都是独立申请下来的空间&#xff0c;我们称之为“节点、结点”。 节点的组成主要由…

横扫Spark之 - 22个常见的转换算子

水善利万物而不争&#xff0c;处众人之所恶&#xff0c;故几于道&#x1f4a6; 文章目录 1. map()2. flatMap()3. filter()4. mapPartitions()5. mapPartitionsWithIndex()6. groupBy()7. distinct()8. coalesce()9. repartition()10. sortBy()11. intersection()12.union()13.…

5G技术对物联网的影响

随着数字化转型的加速&#xff0c;5G技术作为通信领域的一次重大革新&#xff0c;正在对物联网&#xff08;IoT&#xff09;产生深远的影响。对于刚入行的朋友们来说&#xff0c;理解5G技术及其对物联网应用的意义&#xff0c;是把握行业发展趋势的关键。 让我们简单了解什么是…
最新文章