文章目录
- 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种状态:
-
新建状态(New):当线程对象被创建时,它处于新建状态。
-
就绪状态(Runnable):当线程对象调用start()方法后,线程进入就绪状态,等待获取CPU时间片。
-
阻塞状态(Blocked):当线程因为某些原因(如等待输入输出、等待锁、等待其他线程执行完毕等)而暂时停止执行时,线程进入阻塞状态。
-
等待状态(Waiting):当线程调用wait()方法、join()方法或LockSupport.park()方法时,线程进入等待状态。
-
超时等待状态(Timed Waiting):当线程调用sleep()方法、wait()方法指定超时时间、join()方法指定超时时间或LockSupport.parkNanos()方法时,线程进入超时等待状态。
-
终止状态(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学习之旅》在不断更新中,欢迎订阅!
"愿与君共勉,携手共进!