Thread类的基本用法干货总结

1. 线程创建和启动

创建

线程的创建有4种方法,前面的博客中也提到过,分别是创建Thread子类、创建类实现Runnable接口、匿名内部类 和 Lambda写法。

✅创建Thread子类,重写run方法
java 复制代码
class MyThread extends Thread{
        @Override
        public void run() {
            System.out.println("这是线程1");
        }
    }
✅实现Runnable接口,重写run方法
java 复制代码
class MyRunnable implements Runnable{
        @Override
        public void run() {
            System.out.println("这是线程2");
        }
    }
✅匿名内部类
  • Thread子类对象
java 复制代码
 //使用匿名类创建Thread 子类对象
        Thread t3=new Thread(){
            @Override
            public void run() {
                System.out.println("这是 线程3");
            }
        };
  • Runnable子类对象
java 复制代码
 //使用匿名类创建Runnable 子类对象
        Thread t4=new Thread(new Runnable() {
            @Override
            public void run() {
                System.out.println("这是 线程4");
            }
        });
✅Lambda写法
java 复制代码
public static void main(String[] args) {
        Thread t5=new Thread(()->{
            System.out.println("这是线程5");
        });
    }

启动

对于创建好的线程,我们想要启动线程,就需要调用start方法启动线程,于是加入到操作系统的调度中来。

java 复制代码
t.start();//启动线程

2. 线程休眠 sleep()

Thread类的静态方法 Thread.sleep(毫秒 ),可以让线程主动休眠,放弃CPU,时间一到,立刻进入准备状态,等待cpu调度。

java 复制代码
Thread.sleep(3000);//让当前线程休眠3000ms

但使用休眠会抛出 InterruptedException 异常,所以必须使用try-catch块捕获异常:

java 复制代码
try {
    Thread.sleep(2000);
} catch (InterruptedException e) {
    e.printStackTrace();
}

需要注意的是,sleep方法不会释放锁,可以理解为" 抱着锁睡 "。

3. 线程等待 wait()

Object类的 wait() 方法,可以让线程进入等待池,同时主动释放锁,等待**notify() 或 notifyAll()**唤醒线程,是线程继续执行。

但在使用wait方法时,为了保证线程安全,需要搭配同步锁 (synchronized);为了避免线程被虚假唤醒,需要搭配while循环 。

java 复制代码
synchronized (this) {
    while (条件不满足) {
        wait();
    }
    // 满足条件后执行任务
}

那notify() 和 notifyAll() 有何区别呢,既然都可以唤醒,为何要设置两个唤醒方式?

  1. notify() 只能唤醒一个线程。
  2. notifyAll() 能唤醒当前进程中的所有线程。
  3. 当进程中的线程数量较多时,如果使用notify()只只唤醒一个线程,可能会导致线程饿死,就是总有线程始终得不到执行,使用notifyAll()便可以使各个线程公平竞争,谁满足条件谁就可以往下执行。

4. 线程中断 interrupt()

首先需要明白,线程中断不是杀死线程,而是给线程做一个中断标记,至于要不要继续执行,由线程自己决定。

线程中断的三个核心方法:

  1. 线程对象.interrupt() → 给当前线程设置中断标记。
  2. 线程对象.interrupted() → 判断当前线程是否带有中断标记。
  3. Thread.interrupted() → 判断并清除当前正在执行的线程的中断标记。

两种中断场景:

1. 正常中断:

只是打个标记,表示线程可能中断,具体是否中断由线程自己决定。

2.阻塞等待(wait/sleep/join):

由于线程此时使堵塞状态,已经中断,此时一旦调用interrupt()方法,就会抛出InterruptedException 异常

5. 获取线程实例 & 常用方法

要获取线程实例对象,一般调用 Thread.currentThread() 方法。

java 复制代码
Thread current = Thread.currentThread();

常用方法:

java 复制代码
Thread.currentThread().getName();   // 获取线程名
Thread.currentThread().setName("主线程"); // 设置线程名

t.isAlive();        // 判断线程是否存活
t.getPriority();    // 获取优先级
t.setPriority(5);   // 设置优先级

以上就是关于Thread类的基本用方法的干活总结,感兴趣的友友不妨点个关注再走叭~

相关推荐
ym hyd 1117 分钟前
门诊挂号系统源码 Java+SpringBoot+Vue3 前后分离
java·vue.js·spring boot·毕设
杨丰玮4189 分钟前
C语言核心语法
java·c语言·开发语言·学习方法
海宇AI15 分钟前
Java数据工程:利用海宇婚恋风险报告优化高端婚恋实名与涉诉核验合规体验
java·人工智能
CEZ20 分钟前
中小企业上 WMS 该先上哪几块:JeeWMS 开源 Java 仓库管理系统的分批上线清单
java·开源
Wang's Blog29 分钟前
Java框架 SpringCloud 快速入门: Gateway 路由的过滤器配置
java·spring cloud·gateway
迅猛龙办公室1 小时前
python实现简单进度条
java·前端·python
斯内普吖1 小时前
(开源)宠物饲养系统实战指南 基于 Java + SSM + Vue + MySQL
java·vue.js·mysql·开源·宠物
知守观1 小时前
Spring Boot 2.1 → 3.5 迁移推演:这个 2018 年的项目会炸在哪
java·spring boot
Flynt1 小时前
800KB 的 JSON 吃掉 8.5 秒 CPU:jackson 这波修复里,最容易被漏掉的洞藏在字符串里
java·安全
后端LV1 小时前
Caffeine 快到 1450 万 ops/s,为什么我还是不敢说数据一致
java·后端