目录
一.简介
在之前的EE初阶文章中,我们为大家介绍了多线程创建的5种方法,这里再给大家回顾一下。
1.继承Thread 2.实现Runnable 3.匿名内部类 4.匿名内部类(实现Runnable) 5.lambda表达式(最常用的)。具体的代码实现可看:JavaEE初阶--进程与线程的区别与联系-CSDN博客
本篇文章将继续给大家介绍Thread的其他基本用法
二.Thread的常见属性
属性 | 获取方法 |
ID | getId() |
名称 | getName() |
状态 | getState() |
优先级 | getPriority() |
是否后台线程 | isDaemon() |
是否存活 | isAlive() |
是否被中断 | isInterrupted() |
ID是线程唯一标识,不同线程不会重复。
名称是各种调试工具用到。
状态表示线程当前所处的一个情况,接下来会给大家演示线程不同的状态。
优先级高的线程理论上来说更容易被调度到。
关于后台线程,JVM会在一个进程的所有非后台线程结束后,才会结束运行。
是否存货,run方法是否运行结束了。
线程的中断问题。
代码演示:
public class Demo {
public static void main(String[] args) {
Thread t1=new Thread(() -> {
for (int i = 0; i < 10; i++) {
try {
System.out.println(Thread.currentThread().getName()+"开始");
Thread.sleep(1000);
} catch (InterruptedException e) {
throw new RuntimeException(e);
}
}
System.out.println(Thread.currentThread().getName()+"结束");
});
System.out.println(Thread.currentThread().getName() + t1.getId()); //获取ID
System.out.println(Thread.currentThread().getName() + t1.getName()); //获取名字
System.out.println(Thread.currentThread().getName() + t1.getState()); //获取状态
System.out.println(Thread.currentThread().getName() + t1.getPriority()); //获取优先级
System.out.println(Thread.currentThread().getName() + t1.isDaemon()); //查看后台线程
System.out.println(Thread.currentThread().getName() + t1.isAlive()); //是否存活
System.out.println(Thread.currentThread().getName() + t1.isInterrupted()); //是否被打断
t1.start();
while(t1.isAlive()){
}
System.out.println(Thread.currentThread().getName() + t1.getState());
}
}
结果展示:
三.Thread类的基本用法
3.1 线程的创建
上文介绍过,此处不再重复。
3.2 线程的启动
t1.start();
调用start方法,才真的在操作系统的底层创建出一个线程。
3.3 线程的等待
有的时候,我们需要等待一个线程完成它的工作后,才能进行下一步工作,所以我们就需要一个方法来明确等待线程的结束。
这时我们就需要引入 join()方法。
join()还存在着其他用法:
方法 | 说明 |
join() | 等待线程结束 |
join(long millis) | 等待线程结束,最多等millis毫秒 |
join(long millis,int nanos) | 同上面,但具有更高的精度 |
3.4 线程的休眠
因为线程的调度是不可控的,所以,休眠方法只能保证休眠时间是大于等于参数设置的休眠时间的。
方法 | 说明 |
public static void sleep(long millis) throws InterruptedException | 休眠当前线程 |
public static void sleep(long millis ,int nanos) throws InterruptedException | 拥有更高的精度 |
public class Demo2 {
public static void main(String[] args) throws InterruptedException {
System.out.println(System.currentTimeMillis());
Thread.sleep(3000);
System.out.println(System.currentTimeMillis());
}
}
3.5 线程的中断
方法 | 说明 |
public void interrupt() | 中断对象关联的线程,如果线程正在阻塞 |
public static boolean interrupted() | 判断当前线程的中断标志位是否设置 |
public boolean isInterrupted() | 判断对象关联的线程的标志位是否设置 |
thread受到通知的方式有两种:
1.如果线程因为调用wait/join/sleep等方法而阻塞挂起,则以InterruptedException异常的形式通知,清除中断标志。
2.否则,只是内部的一个中断标志被设置,thread可以通过Thread.currentThread().isInterrupted()判断指定线程的中断标志被设置,不清除中断标志这种方式通知收到的更及时,即使线程正在sleep也可以马上收到。
3.6 获取线程实例
public class Demo3 {
public static void main(String[] args) {
Thread thread=Thread.currentThread();
System.out.println(thread.getName());
}
}
四.总结
本篇文章为大家介绍了一下Thread的常见属性以及基本用法。欢迎各位在评论区讨论以及指出文章不足,感谢观看!