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://xiahunao.cn/news/2776623.html

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

相关文章

Git版本与分支

目录 一、Git 二、配置SSH 1.什么是SSH Key 2.配置SSH Key 三、分支 1.为什么要使用分支 2.四个环境及特点 3.实践操作 1.创建分支 2.查看分支 3.切换分支 4.合并分支 5.删除分支 6.重命名分支 7.推送远程分支 8.拉取远程分支 9.克隆指定分支 四、版本 1.什…

[BUUTF]-PWN:wdb2018_guess解析

查看保护 查看ida 这道题并不复杂,只是要注意一点细节 完整exp: from pwn import* from LibcSearcher import* pprocess(./guess) premote(node5.buuoj.cn,28068) puts_got0x602020payloadba*0x128p64(puts_got) p.sendlineafter(bPlease type your gu…

国产三维剖面仪—MPAS-100相控参量阵浅地层剖面仪

最近声学所东海站邹博士发来了他们最新的浅地层剖面仪—MPAS-100相控参量阵浅地层剖面仪的资料,市场型号GeoInsight,委托Ocean Physics Technology公司销售,地大李师兄的公司负责技术支持。 MPAS-100相控参量阵浅地层剖面仪就是俗称的三维浅…

【玩转408数据结构】线性表——定义和基本操作

考点剖析 线性表是算法题命题的重点,该类题目实现相对容易且代码量不高,但需要最优的性能(也就是其时间复杂度以及空间复杂度最优),这样才可以获得满分。所以在考研复习中,我们需要掌握线性表的基本操作&am…

Red Hat安装Red Hat OpenShift Local

文章目录 环境安装需求硬件操作系统软件包 安装 使用Red Hat OpenShift Local预设置设置Red Hat OpenShift Local启动实例访问OpenShift集群访问OpenShift web console使用OpenShift CLI访问OpenShift集群访问内部 OpenShift registry 使用odo部署示例应用安装odo 停止实例删除…

Qt QML学习(一):Qt Quick 与 QML 简介

参考引用 QML和Qt Quick快速入门全面认识 Qt Widgets、QML、Qt Quick 1. Qt Widgets、QML、Qt Quick 区别 1.1 QML 和 Qt Quick 是什么关系? 1.1.1 从概念上区分 QML 是一种用户界面规范和标记语言,它允许开发人员创建高性能、流畅的动画和具有视觉吸引…

LiteFlow规则引擎框架

LiteFlow规则引擎框架 Hi,我是阿昌,今天介绍一个规则引擎框架,LiteFlow; 一、前言 那首先得知道什么是规则引擎?规则引擎是 一种用于自动化处理业务规则的软件组件。 在软件行业中,规则引擎通常用于解决…

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

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

JSP页面组件

JSP页面组件 JSP页面由各种组件组成,可以在JSP应用程序中使用这些组件来添加其他功能,如添加添加和循环结构或使用JavaBean组件。JSP页面的四个组件为: JSP指令JSP脚本JSP隐式对象JSP动作1. JSP指令 JSP页面中的指令元素提供关于特定JSP页面的全局信息,有三种类型: Page…

你是在独立思考,还是在被洗脑?

你有过这样的经历吗? 老板走过来,急匆匆丢给你一句:帮我整理一下那个客户的资料,下午给我。你抬头,应道「好好好」。老板扬长而去。你转念一想: 等等,哪个客户?什么资料?…

发文新思路!双流卷积!CWT-DSCNN-MSA基于时序特征、cwt小波时频图的双流卷积融合注意力机制的故障识别程序!直接运行!

适用平台:Matlab2023版本及以上 本程序参考中文EI期刊《电力自动化设备》2023年12月29号网络首发文献:《基于格拉姆角场与并行CNN的并网逆变器开关管健康诊断》,此外,在此基础上进一步对模型进行多重改进,每个人都可以构造属于自…

你的立身之本是什么?

去年发生的一切,大到疫情、政治经济形势、行业的萎靡和震荡,小到身边的跳槽、裁员、公司倒闭……似乎都在告诉我们: 当冲击到来的时候,它是不会提前跟你打招呼的。 接下来的10年,我们所面临的不确定性,比起…

绝缘栅极晶体管IGBT

IGBT(绝缘栅极晶体管): 常用于百V百A级使用,外观上看相比于MOS最大的区别是比较大,mos主要用于中小功率器件中。 本质是一个电子开关,相比于MOS和三极管来说其最大的特点是耐压很高,可达6000V以上&#xf…

保育员答案在哪搜?这4款足够解决问题 #媒体#其他#其他

学会运用各类学习辅助工具和资料,是大学生培养自主学习能力和信息获取能力的重要途径之一。 1.石墨文档 石墨文档(Shimo Docs)是一款强大的在线文档协作工具。它提供了多人实时协作、版本控制、评论和批注等功能,方便学生在学习中进行文档编写、合作项…

VUE学习——事件处理

事件分为内联事件和方法事件。 我们可以使用【v-on】&#xff08;简写&#xff1a;&#xff09;来处理。 内联 <button v-on:click"count">按钮</button><button click"count">按钮</button><p>{{ count }}</p>方法

ClickHouse--01--简介

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 1. ClickHouse 简介1.1 大数据处理场景1.2 什么是 ClickHouse1.3 OLAP 场景的特征 2. ClickHouse 特性2.1 完备的 DBMS 功能2.2 列式存储行式存储: 在数据写入和修改…

Linux线程库封装

一 MyThread.hpp #pragma once #include<pthread.h> #include<iostream> #include<unistd.h> #include<string> #include<ctime>typedef void (*callback_t)(); static int num 1; //任务和线程绑定 class Thread {static void* Routine(void …

容器监控三剑客CAdvisor、Granfana、InfluxDB

容器监控 原生命令 docker stats查看结果 &#x1f629;通过docker stats命令可以很方便的看到当前宿主机上所有容器的CPU,内存以及网络流量等数据&#xff0c;一般小公司够用了。但是&#xff0c;docker stats统计结果只能是当前宿主机的全部容器&#xff0c;数据资料是实…

【OrangePi Zero2的系统移植】交叉编译工具链配置、wiringOP库、智能分类工程代码

一、交叉编译工具链配置 二、交叉编译wiringOP库 三、交叉编译智能分类工程代码 四、Makefile 用于编译 WiringPi 库 一、交叉编译工具链配置 1、关于编译 编译是指将源代码文件&#xff08;如C/C文件&#xff09;经过预处理、编译、汇编和链接等步骤&#xff0c;转换为可执…

第5章 数据库操作

学习目标 了解数据库&#xff0c;能够说出数据库的概念、特点和分类 熟悉Flask-SQLAlchemy的安装&#xff0c;能够在Flask程序中独立安装扩展包Flask-SQLAlchemy 掌握数据库的连接方式&#xff0c;能够通过设置配置项SQLALCHEMY_DATABASE_URI的方式连接数据库 掌握模型的定义…