【Java|多线程与高并发】Thread 常见的方法总结

news2024/11/16 10:36:02

文章目录

  • 1. 前言
  • 2. 方法getId()
  • 3. 方法getName()
  • 4. 方法getState()
  • 5. 方法getPriority(int newPriority)
  • 6. 方法isDaemon()和setDaemon()
  • 7. 方法isAlive()
  • 8. 方法isInterrupted()
  • 9. 方法currentThread()
  • 10. 方法sleep()
  • 11. 方法join()
  • 12. 总结

1. 前言

本文主要介绍Thread类常见的方法

2. 方法getId()

getId()方法可以获取线程的唯一数字标识

这里要说明一下这里获取到的id是Java给Thread对象安排的身份标识. 一个线程是可以有多个id的,例如在JVM中有个id,操作系统的线程API中有个id,内核PCB中也有id.

示例:

    public static void main(String[] args) {
        Thread t = new Thread(() ->{
            
        });
        t.start();
        System.out.println("线程id: "+t.getId());
    }

运行结果:
在这里插入图片描述

3. 方法getName()

getName()用于获取线程的名字.

示例:

    public static void main(String[] args) {
        Thread t = new Thread(() ->{
            
        },"myThread");
        t.start();
        System.out.println("线程id: "+t.getId());
    }

运行结果:
在这里插入图片描述

4. 方法getState()

getState()用于获取线程的状态.

示例:

    public static void main(String[] args) {
        Thread t = new Thread(() ->{
            System.out.println("11");
        },"myThread");
        System.out.println("线程的状态: "+t.getState());
        t.start();
        System.out.println("线程的状态: "+t.getState());
        try {
            t.join();
        } catch (InterruptedException e) {
            throw new RuntimeException(e);
        }
        System.out.println("线程的状态: "+t.getState());
    }

运行截图:
在这里插入图片描述
Java线程的6种状态:

  1. 新建状态(New):当线程对象被创建时,它处于新建状态。

  2. 就绪状态(Runnable):当线程对象调用start()方法后,线程进入就绪状态,等待获取CPU时间片。

  3. 阻塞状态(Blocked):当线程因为某些原因(如等待输入输出、等待锁、等待其他线程执行完毕等)而暂时停止执行时,线程进入阻塞状态。

  4. 等待状态(Waiting):当线程调用wait()方法、join()方法或LockSupport.park()方法时,线程进入等待状态。

  5. 超时等待状态(Timed Waiting):当线程调用sleep()方法、wait()方法指定超时时间、join()方法指定超时时间或LockSupport.parkNanos()方法时,线程进入超时等待状态。

  6. 终止状态(Terminated):当线程run()方法执行完毕或者调用stop()方法时,线程进入终止状态。

线程的状态还是很重要的,会在后面单独介绍线程的状态

5. 方法getPriority(int newPriority)

getPriority(int newPriority)方法用于获取线程的优先级.

在操作系统中,线程可以划分优先级,优先级较高的线程得到的CPU资源较多,即CPU优先执行的优先级较高的线程对象中的任务.简单来说就是让高优先级的线程获取到更多的CPU时间片.
设置优先级可以确保哪一个线程可以优先执行

来看一下源码
在这里插入图片描述
在这里插入图片描述
在源码中我们可以看到Java的线程优先级分为0~10,如果newPriority>10或者 < 1就会抛出异常throw new IllegalArgumentException()

6. 方法isDaemon()和setDaemon()

isDaemon()方法获取当前线程是否是守护线程
setDaemon()方法设置当前的线程是否是守护线程

Java有两种线程,一种是"用户线程",也称"非守护线程",另一种是"守护线程"

什么是守护线程?

Java守护线程(Daemon Thread)是一种特殊的线程,它的作用是为其他线程提供服务,当所有非守护线程结束时,守护线程也会自动结束。守护线程通常用于执行一些后台任务,如垃圾回收、内存管理等。

在Java中,可以通过Thread类的setDaemon()方法将线程设置为守护线程。当一个线程被设置为守护线程后,它将自动随着主线程的结束而结束,无论它是否执行完毕。

需要注意的是,守护线程不能用来执行一些需要保证完整性的任务,因为它们可能会在任何时候被中断。因此,守护线程通常用于执行一些辅助性的任务,如日志记录、监控等。

7. 方法isAlive()

isAlive()方法判断内核中线程对象是否存活

Thread对象虽然和内核中的线程是一一对应的关系,但是生命周期是不同的.
创建Thread对象,内核中的线程不一定有,得调用start()方法,内核线程才会有.当内核线程执行完(run()方法执行完),内核线程就不存在了,但Thread对象还在.

示例1:

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

运行结果
在这里插入图片描述
示例2:
加上join()方法等待线程执行结束

    public static void main(String[] args) {
        Thread t = new Thread(() -> {
            System.out.println(1);
        });
        t.start();
        try {
            t.join();
        } catch (InterruptedException e) {
            throw new RuntimeException(e);
        }
        System.out.println("线程是否存活: "+ t.isAlive());
    }

运行结果:
在这里插入图片描述

8. 方法isInterrupted()

isInterrupted()方法判断线程是否被中断.它不会清除线程的中断状态,只是返回当前线程的中断状态。如果线程被中断,则返回true,否则返回false。

需要注意的是,调用该方法并不会使线程中断,只是查询当前线程是否被中断。如果需要中断线程,可以调用Thread类的interrupt()方法。

9. 方法currentThread()

currentThread()方法可以返回代码段正在被哪个线程调用

示例:

    public static void main(String[] args) {
        Thread t = new Thread(() -> {
            System.out.println(Thread.currentThread().getName());
        },"myThread");
        t.start();
        System.out.println(Thread.currentThread().getName());
    }

运行结果:
在这里插入图片描述
可以看到返回了两个线程的名字,main线程(主线程)myThread线程(我创建的线程).

10. 方法sleep()

sleep()方法的作用是在指定的毫秒数内让当前"正在执行的线程"休眠(暂停执行)

方法描述
sleep(long millis)休眠当前线程 millis毫秒
sleep(long millis,int nanos)可以更高精度的休眠

需要注意的是,sleep方法可能会抛出InterruptedException异常,这是因为在线程睡眠期间,如果有其他线程中断了当前线程,那么就会抛出这个异常。因此,在使用sleep方法时,通常需要在try-catch语句中处理这个异常。

11. 方法join()

join()方法的作用是等待该线程终止。
具体来说,当一个线程调用另一个线程的join()方法时,该线程会被阻塞,直到被调用的线程执行完毕。

示例:

   public static void main(String[] args) {
        Thread t = new Thread(() -> {
            try {
                Thread.sleep(3000);
            } catch (InterruptedException e) {
                throw new RuntimeException(e);
            }
            System.out.println("sleep方法执行完毕!");
        });
        t.start();
        try {
            t.join();
        } catch (InterruptedException e) {
            throw new RuntimeException(e);
        }
        System.out.println("join方法执行后");
    }

运行结果:
在这里插入图片描述

12. 总结

方法描述
getId()获取线程的唯一数字标识
getName()获取线程的名字
getState()获取线程的状态
getPriority(int newPriority)获取线程的优先级
isDaemon()判断线程是否是守护线程
setDaemon()设置线程是否是守护线程
isAlive()判断内核中线程对象是否存活
isInterrupted()判断线程是否被中断
currentThread()返回代码段正在被哪个线程调用
sleep()让当前"正在执行的线程"休眠
join()等待该线程终止

以上就是一些Thread类常见的方法,但Thread类中的方法远不止这些,还有一些更加重要的方法.
欲知后事如何,且听下回分解!在这里插入图片描述

感谢你的观看!希望这篇文章能帮到你!
专栏: 《从零开始的Java学习之旅》在不断更新中,欢迎订阅!
"愿与君共勉,携手共进! 在这里插入图片描述

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

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

相关文章

第11章_数据库的设计规范

第11章_数据库的设计规范 1. 为什么需要数据库设计 我们在设计数据表的时候&#xff0c;要考虑很多问题。比如: 用户都需要什么数据?需要在数据表中保存哪些数据?如何保证数据表中数据的正确性&#xff0c;当插入、删除、更新的时候该进行怎样的约束检查?。如何降低数据表…

javascript基础十八:说说你对JavaScript中事件循环的理解​

一、是什么 JavaScript 在设计之初便是单线程&#xff0c;即指程序运行时&#xff0c;只有一个线程存在&#xff0c;同一时间只能做一件事 为什么要这么设计&#xff0c;跟JavaScript的应用场景有关 JavaScript 初期作为一门浏览器脚本语言&#xff0c;通常用于操作 DOM &#…

【C++】C++11新特性的讲解

新特性讲解第一篇~ 文章目录 前言一、较为重要的新特性 1.统一的初始化列表2.decltype关键字3.右值引用移动语义总结 前言 C11 简介 &#xff1a; 在 2003 年 C 标准委员会曾经提交了一份技术勘误表 ( 简称 TC1) &#xff0c;使得 C03 这个名字已经取代了 C98 称为 C11 之前的…

【游戏编程扯淡精粹】工作第三年总结

工作第三年总结 文章目录 工作第三年总结#1 做了什么自研路线Lua 脚本系统ToolX #2 职业发展如何做事技术中台化内卷的职业市场个人成长 #3 心态建设Owner vs 打工人 今年仍然是个人成长视角更多一些&#xff0c;额外新学到的重点是&#xff0c;借助团队力量 先介绍两个词&…

通过自由度比较迭代次数

( A, B )---3*30*2---( 1, 0 )( 0, 1 ) 让网络的输入只有3个节点&#xff0c;AB训练集各由5张二值化的图片组成&#xff0c;让A中有7个1&#xff0c;B中全是0&#xff0c;让A的5行1的数量为1&#xff0c;1&#xff0c;1&#xff0c;2&#xff0c;2&#xff1b;让A的3列1的数量…

chatgpt赋能python:Python列表从后往前删除的方法及注意事项

Python列表从后往前删除的方法及注意事项 Python是一种功能强大而易于使用的编程语言。在Python中&#xff0c;列表是重要的数据类型之一&#xff0c;它可以存储任意类型的数据&#xff0c;例如整数、字符串、浮点数和对象等&#xff0c;而且列表数据可以动态添加或删除。在编…

numpy模块

目录 ❤ numpy简介 ❤ 为什么用numpy ❤ 创建numpy数组 ❤ numpy数组的常用属性 ❤ 获取numpy数组的行列数 ❤ 切割numpy数组 ❤ numpy数组元素替换 ❤ numpy数组的合并 ❤ 通过函数创建numpy数组 array arange linspace/logspace zeros/ones/eye/empty …

多功能电子听诊器(CMS-VESD)产品使用说明

Copyright reserved 子曰&#xff1a;桃李不言&#xff0c;下自成蹊。 Copyright reserved Ⅰ . 产品描述 : C M S − V E S D Ⅰ. 产品描述:^{CMS-VESD} Ⅰ.产品描述:CMS−VESD Ⅰ . 1 主要特点 : 如有疑问可留言沟通交流 Ⅰ.1 主要特点:^{如有疑问可留言沟通交流} Ⅰ.1主要特…

[python bezier贝塞尔曲线] 数值解法、德卡斯特里奥解法解法以及bezier库的使用demo

修改自这个老哥的&#xff0c;非常的nice,此处仅作为学习记录。 matplotlib3.7.0 可行 Note: 数值解法是真的快 先上图 import matplotlib.pyplot as plt from mpl_toolkits.mplot3d import Axes3D import numpy as np import math import timeclass Bezier:def __init__(se…

使用HTML5开发Kinect体感游戏

一、简介 我们要做的是怎样一款游戏&#xff1f; 在前不久成都TGC2016展会上&#xff0c;我们开发了一款《火影忍者手游》的体感游戏&#xff0c;主要模拟手游章节《九尾袭来 》&#xff0c;用户化身四代&#xff0c;与九尾进行对决&#xff0c;吸引了大量玩家参与。 表面上看…

Makerbase SimpleFOC ESP32 例程5 双电机闭环位置测试

Makerbase SimpleFOC ESP32 例程5 双电机闭环位置测试 第一部分 硬件介绍 1.1 硬件清单 序号品名数量1ESP32 FOC V1.0 主板12YT2804电机2312V电源适配器14USB 线156pin杜邦线2 注意&#xff1a;YT2804是改装的云台无刷电机,带有AS5600编码器&#xff0c;可实现360连续运转。…

香蕉派(Banana Pi) BPi-P2 Zero开源硬件物联网开发板评测

我们从制造商处收到的样品 BPi-P2 Zero 和 BPi-P2 Maker SBC 用于本次审查的体验非常好。这些都是基于多年H3/H2 SoC使用经验的高质量硬件实现。 优点 优良的价格和适用性稳定且经过验证的架构低散热供电电源WiFi / 蓝牙 kod 零模型完美平衡的 Maker 模型 Banana Pi BPi-P2 的…

设备树与pinctrl

设备树与pinctrl 原理&#xff1a;芯片内部有个内存控制器访问芯片的各个控制器单元&#xff08;如IIC、USB等&#xff09;&#xff0c; 阅读手册设置其相应功能即可。 设备树 是一种描述硬件的数据结构,由专门文件格式与语法结构。 pinctrl Pinctrl&#xff1a;Pin Contr…

vue-router(element侧导栏,子组件内容切换,不传参)使用的详细步骤

大家好&#xff0c;我是csdn的博主&#xff1a;lqj_本人 这是我的个人博客主页&#xff1a; lqj_本人的博客_CSDN博客-微信小程序,前端,python领域博主lqj_本人擅长微信小程序,前端,python,等方面的知识https://blog.csdn.net/lbcyllqj?spm1011.2415.3001.5343哔哩哔哩欢迎关注…

如何申请免费ChatGPT 2500刀初创金

近日OpenAI 推出了OpenAI for Startups项目&#xff0c;那么什么是Startups项目呢&#xff1a; 它是由全球知名的人工智能研究公司 OpenAI 推出的一个开放式的创业计划&#xff0c;旨在为初创公司提供一种新的激励机制和技术推广方式。 也就是说我们可以用自己账号申请&#x…

【软件工程题库】第四章 概要设计

&#x1f57a;作者&#xff1a; 迷茫的启明星 学习路线C语言从0到1C初阶数据结构从0到1 &#x1f618;欢迎关注&#xff1a;&#x1f44d;点赞&#x1f64c;收藏✍️留言 &#x1f3c7;码字不易&#xff0c;你的&#x1f44d;点赞&#x1f64c;收藏❤️关注对我真的很重要&…

淬体归元,运营商资源域元数据管理

资源元数据是通信行业资源管理业务开展的基础性支撑要素&#xff0c;它定义了资源业务领域相关概念、关系和规则&#xff0c;即各种设施、缆线、设备、链路等网络资源的规格、属性、字典及相关存储模型等信息。高质量的元数据是提升业务效率、加强管理与分析能力的必要条件&…

多线程安全的案例展示与解决方案

一、概念 1. 什么是线程安全 当多个线程访问一个对象时&#xff0c;如果不用考虑这些线程在运行时环境下的调度和交替执行&#xff0c;也不需要进行额外的同步&#xff0c;或者在调用方进行任何其他的协调操作&#xff0c;调用这个对象的行为都可以获得正确的结果&#xff0c…

为什么HTTPS是安全的?

在谈论 HTTPS 协议之前&#xff0c;先来回顾一下 HTTP 协议的概念。 1. HTTP 协议 1.1 HTTP 协议介绍 HTTP 协议是一种基于文本的传输协议&#xff0c;它位于 OSI 网络模型中的应用层。 HTTP 协议是通过客户端和服务器的请求应答来进行通讯&#xff0c;目前协议由之前的 RFC…

Java程序设计入门教程--成员变量

成员的分类 实例成员 实例成员是属于对象的&#xff0c;即属于对象级别&#xff0c;包括实例成员属性&#xff08;也称为实例成员变量&#xff09;和实例成员方法&#xff0c;只有创建了对象之后才能访问实例成员属性和实例成员方法。 类成员 类成员属于类的&#xff0c;类成…