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

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

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());
    }

运行结果:


8c9779549254414a8d8b5b42203abcdc.png


3. 方法getName()

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


示例:


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

运行结果:


e5b3eb91e9d64b728f01c161553d4c8c.png


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());
    }

运行截图:


9c1c4ea8ee9944b784a84ea34af3079c.png

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时间片.

设置优先级可以确保哪一个线程可以优先执行


来看一下源码



68a1498ec9a6439397618c2d8fa3b430.png

0202edaf947b4cbaac5f31017d319eb7.png

在源码中我们可以看到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());
    }

运行结果



1b5feccc528a4be4b774cf2560abfbbe.png

示例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());
    }

运行结果:


a8396652153543d6aa06abd3d2d6baec.png


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());
    }

运行结果:

26c7cd44d4f5446989b4c0372779ed0a.png


可以看到返回了两个线程的名字,main线程(主线程)和myThread线程(我创建的线程).


10. 方法sleep()

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


image.png

需要注意的是,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方法执行后");
    }

运行结果:


6e1e8d93777242a1b513144ba4587721.png


12. 总结


image.png

以上就是一些Thread类常见的方法,但Thread类中的方法远不止这些,还有一些更加重要的方法.

欲知后事如何,且听下回分解!


感谢你的观看!希望这篇文章能帮到你!

专栏: 《从零开始的Java学习之旅》在不断更新中,欢迎订阅!

"愿与君共勉,携手共进!


8fbf2a7f2d0e4db782e58035677a303d.png

相关文章
|
1月前
|
算法 Java 开发者
Java 项目实战数字华容道与石头迷阵游戏开发详解及实战方法
本文介绍了使用Java实现数字华容道和石头迷阵游戏的技术方案与应用实例,涵盖GUI界面设计、二维数组操作、游戏逻辑控制及自动解法算法(如A*),适合Java开发者学习游戏开发技巧。
157 47
|
2月前
|
安全 Java API
Java 集合高级应用与实战技巧之高效运用方法及实战案例解析
本课程深入讲解Java集合的高级应用与实战技巧,涵盖Stream API、并行处理、Optional类、现代化Map操作、不可变集合、异步处理及高级排序等核心内容,结合丰富示例,助你掌握Java集合的高效运用,提升代码质量与开发效率。
175 0
|
2月前
|
算法 搜索推荐 Java
Java中的Collections.shuffle()方法及示例
`Collections.shuffle()` 是 Java 中用于随机打乱列表顺序的方法,基于 Fisher-Yates 算法实现,支持原地修改。可选传入自定义 `Random` 对象以实现结果可重复,适用于抽奖、游戏、随机抽样等场景。
73 0
|
2月前
|
安全 算法 Java
Java 多线程:线程安全与同步控制的深度解析
本文介绍了 Java 多线程开发的关键技术,涵盖线程的创建与启动、线程安全问题及其解决方案,包括 synchronized 关键字、原子类和线程间通信机制。通过示例代码讲解了多线程编程中的常见问题与优化方法,帮助开发者提升程序性能与稳定性。
107 0
|
2月前
|
数据采集 监控 调度
干货分享“用 多线程 爬取数据”:单线程 + 协程的效率反超 3 倍,这才是 Python 异步的正确打开方式
在 Python 爬虫中,多线程因 GIL 和切换开销效率低下,而协程通过用户态调度实现高并发,大幅提升爬取效率。本文详解协程原理、实战对比多线程性能,并提供最佳实践,助你掌握异步爬虫核心技术。
|
3月前
|
Java 数据挖掘 调度
Java 多线程创建零基础入门新手指南:从零开始全面学习多线程创建方法
本文从零基础角度出发,深入浅出地讲解Java多线程的创建方式。内容涵盖继承`Thread`类、实现`Runnable`接口、使用`Callable`和`Future`接口以及线程池的创建与管理等核心知识点。通过代码示例与应用场景分析,帮助读者理解每种方式的特点及适用场景,理论结合实践,轻松掌握Java多线程编程 essentials。
182 5
|
7月前
|
Python
python3多线程中使用线程睡眠
本文详细介绍了Python3多线程编程中使用线程睡眠的基本方法和应用场景。通过 `time.sleep()`函数,可以使线程暂停执行一段指定的时间,从而控制线程的执行节奏。通过实际示例演示了如何在多线程中使用线程睡眠来实现计数器和下载器功能。希望本文能帮助您更好地理解和应用Python多线程编程,提高程序的并发能力和执行效率。
186 20
|
7月前
|
安全 Java C#
Unity多线程使用(线程池)
在C#中使用线程池需引用`System.Threading`。创建单个线程时,务必在Unity程序停止前关闭线程(如使用`Thread.Abort()`),否则可能导致崩溃。示例代码展示了如何创建和管理线程,确保在线程中执行任务并在主线程中处理结果。完整代码包括线程池队列、主线程检查及线程安全的操作队列管理,确保多线程操作的稳定性和安全性。
|
9月前
|
NoSQL Redis
单线程传奇Redis,为何引入多线程?
Redis 4.0 引入多线程支持,主要用于后台对象删除、处理阻塞命令和网络 I/O 等操作,以提高并发性和性能。尽管如此,Redis 仍保留单线程执行模型处理客户端请求,确保高效性和简单性。多线程仅用于优化后台任务,如异步删除过期对象和分担读写操作,从而提升整体性能。
144 1
|
11月前
|
存储 消息中间件 资源调度
C++ 多线程之初识多线程
这篇文章介绍了C++多线程的基本概念,包括进程和线程的定义、并发的实现方式,以及如何在C++中创建和管理线程,包括使用`std::thread`库、线程的join和detach方法,并通过示例代码展示了如何创建和使用多线程。
129 1
C++ 多线程之初识多线程