JAVA线程的调度方法与状态详解,yield(), join(), sleep()

本文详细介绍了Java线程的调度方法,包括线程的新生、就绪、运行、阻塞和死亡状态。重点讨论了sleep()、yield()和join()方法,解释了它们如何影响线程的状态转换。建议使用标志位而非弃用的stop()或destroy()方法来终止线程,同时深入探讨了这三个方法在多线程环境中的应用和效果。

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

线程的状态

在这里插入图片描述

[A] 线程对象一旦被创建即进入新生状态,创建的典型代码如下:

Thread t = new Thread();

每一个线程都会获得自己的工作空间(一片内存),该工作空间将于主内存打交道。

B] 当调用start()方法时,线程即进入就绪状态,但是不意味着立即调度执行,而是等待CPU的安排

[C] 只有当线程进入运行状态,代码块才会真正被执行

[D] 当调用sleep(), wait(), 或同步锁定时,线程进入阻塞状态。不保证调用以上方法时线程就立即暂停。阻塞事件解除后,线程重新进入就绪状态,等待CPU的重新安排。

[E] 线程进入死亡状态,也就是想方设法使其中断执行或者其执行完毕。一旦进入死亡状态就不可以再调用start()方法,而是需要重新获得新的线程对象。

如何使一个线程终止(死亡)

不要使用JDK提供的stop(), destory()方法,它们本身也是不安全的并且已经被deprecated,推荐使用标志位的方法来控制(循环)语句,使run方法自然结束。

如下代码所示

public class ThreadTest extends Thread {


    private boolean flag=true;
    private int num;

    @Override
    public void run() {
        while(flag) {
            System.out.println("线程正在运行,第"+String.valueOf(num++)+"轮运行");
        }


    }

    public void terminate(){
        this.flag=false;/*将标志为改为false,使run方法自然结束*/
        System.out.println("进程被通知停止了");
    }

    public static void main(String[] args) {
        ThreadTest threadTest = new ThreadTest();
        threadTest.start();

        for(int i =0;i<100;i++){
            if(i==90){
                threadTest.terminate();
            }
        }
        
    }
}

阻塞状态

sleep()方法

thread.sleep(1000)/*该进程休眠1000ms*/
  1. sleep时间达到后线程进入就绪状态
  2. sleep可以模拟网络延时,倒计时等
  3. 每一个对象都有一个锁,sleep对象不会释放锁,占着茅坑不拉屎
  4. sleep存在异常InterruptedException,需要用try-catch包裹
  5. thread对象出现在哪个线程中,在哪个线程中起作用。

yield()方法 礼让

thread.yield()*将该线程转为就绪状态,重新等待CPU分配*/

礼让线程,让当前正在执行的线程暂停,避免一个线程占用资源过久

不是阻塞线程,而是将线程从运行状态转为就绪状态,重新竞争资源,对外可能并没有表现出礼让。

join()方法 合并线程,(被)插队线程

thread.join(1000)
/*该语句出现在哪个线程中,
哪个线程被阻塞,需要等待其他线程执行完毕后才能继续,
1000代表最大容忍时间,超过该时间,返回就绪状态*/

join合并线程,待此线程执行完毕后,再执行其他线程,其他线程阻塞

在这里插入图片描述

黄车阻塞了后面的车辆,需要待黄车通过(执行完毕后),才能继续执行。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值