Java并发编程—Thread类中的一些方法

本文介绍了Java中Thread类的几个关键方法,包括join()、sleep()、yield()和interrupt()。join()使得调用线程等待目标线程结束;sleep()使线程进入休眠状态不释放锁;yield()请求CPU让步,但不保证执行;interrupt()设置线程中断标志,不直接停止线程,配合isInterrupted()和interrupted()检查中断状态。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Thread中的一些方法(线程状态相关)

1 join()

该方法的作用是让调用该方法的线程加入,让当前线程阻塞,当调用该方法的线程结束后返回。

基本原理如下图所示:
在这里插入图片描述

package com.thread;

public class JoinTest {
    public static Object obj = new Object();
    public static void main(String[] args) {
        //创建线程A
        Thread threadA = new Thread(() -> {
            synchronized (obj) {
                System.out.println("线程A启动了");
                try {
                    Thread.sleep(2000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                System.out.println("线程A结束了,返回到main线程了");
            }
        });
        threadA.start();
        //线程A插入执行,main线程阻塞
        try {
            threadA.join();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        System.out.println("main线程结束了");
    }
}

代码执行后可以看到main线程在threadA执行后才输出"main线程结束了"

2 sleep()

是Thread类的静态方法,会使线程进入阻塞休眠状态,但并不会释放该线程持有的锁,当休眠结束后会返回线程进入就绪状态

package com.thread;

public class SleepTest {
    public static Object obj = new Object();

    public static void main(String[] args) {
        Thread threadA = new Thread(() -> {
            synchronized (obj) {
                System.out.println("线程A持有锁,并休眠2s");
                try {
                    Thread.sleep(2000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                System.out.println("线程执行结束并释放锁");
            }
        });
        Thread threadB = new Thread(() -> {
            try {
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            synchronized (obj) {
                System.out.println("线程B持有锁");
            }
        });
        threadA.start();
        threadB.start();
    }
}

根据运行结果可见,线程A现持有锁,在休眠期间并不会释放锁,故线程B不会进入同步代码块,当线程A执行结束释放锁后才会得到锁并执行同步代码块中的内容。

3yield()

该方法是静态方法,当某个线程调用该方法时,是告诉CPU调度器当前线程请求让出CPU,但CPU可以完全忽视该请求,也就是说该方法是否能请求成功由CPU调度器决定。

4 interrupt()

1 interrupt():线程A运行时,线程B可以调用线程A的interrupt()方法,将线程的中断标志设置为true,注意中断标志是每一个线程的一个属性,该方法只会让改属性的值变为true而不会中断线程A,线程A可以利用改属性实现自身的中断逻辑。

2 isInterrupted():当调用该方法的线程的中断标志为true则返回true,否则返回false;

3 interrupted():该方法是一个静态方法,检测当前线程是否被中断,是则返回true,并重置该线程的中断标志,否则返回false(注意这十个静态方法,并且判断的是当前线程的中断标志,所以哪个线程里调用该方法就是判断哪个线程的中断标志)

package com.thread;

public class InterruptTest {
    public static void main(String[] args) {
        Thread thread = new Thread(() -> {
            for (; ; ) {

            }
        });

        thread.start();
        thread.interrupt();
        System.out.println(thread.isInterrupted());//true
        System.out.println(thread.interrupted());//false
        System.out.println(Thread.interrupted());//false
        System.out.println(thread.isInterrupted());//true
        try {
            thread.join();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        System.out.println("main is over");
    }
}

thread.interrupted()与Thread.interrupted()都是去判断main线程的中断标志

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值