【Java|多线程与高并发】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());
    }

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

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学习之旅》在不断更新中,欢迎订阅!
"愿与君共勉,携手共进! 在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/m0_63463510/article/details/131021071