sleep()、wait()、yield()和join()方法特点及区别

本文详细对比了sleep(), wait(), yield()及join()等线程控制方法的特点与应用场景,包括它们在锁释放、中断响应和线程状态转换方面的区别。

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

sleep()与wait()的区别

  1. 这两个方法来自不同的类,sleep是Thread类的方法,而wait是Object类的方法;
  2. 执行sleep方法后不会释放锁,而执行wait方法后会释放锁;
  3. wait,notify和notifyAll只能在同步方法或同步代码块中调用,而sleep可以在任何地方调用;
  4. sleep必须捕获异常,而wait,notify和notifyAll不需要捕获异常。(如果不是在同步方法或同步代码块中调用wait()方法,则抛出IllegalMOnitorStateException,它是RuntimeException的一个子类,因此,不需要try-catch语句进行捕捉异常)

需要注意以下几点:
1. 在执行notify()或notifyAll()方法后,当前线程不会马上释放该对象锁,需要等到notify()或notifyAll()方法所在的同步方法或同步代码块执行完成,当前线程才会释放锁。
2. 在sleep()状态下interrupt()中断线程,会进入catch语句,并且清除停止状态值,使之变成false。
3. wait(long)方法:如果线程在指定时间(long)内未被唤醒,则自动唤醒。wait(0)等价于wait()。
4. Thread.Sleep(0)的作用是“触发操作系统立刻重新进行一次CPU竞争”。


sleep()与 yield()的区别

  1. sleep()方法给其他线程运行机会时不考虑其他线程的优先级,因此会给低优先级的线程运行的机会yield()方法只会给相同优先级或更高优先级的线程运行的机会
  2. 线程执行sleep()方法后转入阻塞(blocked)状态,而执行yield()方法后转入就绪(ready)状态
  3. sleep()方法声明抛出InterruptedException异常,而yield()方法没有声明任何异常
  4. sleep()方法比yield()方法具有更好的可移植性(跟操作系统CPU调度相关)。
  5. sleep方法需要参数,而yield方法不需要参数。

join方法

作用:使所属的线程对象x正常执行run()方法中的任务,而使当前线程z进行无限期的阻塞,直到线程x执行完成之后(销毁后)再继续执行线程z后面的代码。
join方法具有使线程排队运行的作用,有些类似同步的运行效果。join与synchronized的区别是:
join:在内部使用wait()方法进行等待
synchronized:使用的是“对象监视器”原理作为同步

join与异常:
在join使用过程中,如果当前线程对象z被中断,则当前线程z出现异常。

join(long)中的参数是设定等待时间。

join(long)与sleep(long)的区别
join(long)的功能在内部使用wait(long)方法来实现的,所以join(long)方法具有释放锁的特点,sleep()方法不具有释放锁的特点

join(long)源代码如下

public final synchronized void join(long millis)
    throws InterruptedException {
        long base = System.currentTimeMillis();
        long now = 0;

        if (millis < 0) {
            throw new IllegalArgumentException("timeout value is negative");
        }

        if (millis == 0) {
            while (isAlive()) {
                wait(0);
            }
        } else {
            while (isAlive()) { //获取当前线程执行状态的值,如果此线程已经开始但尚未正常终止,则为 true,否则为 false。
                long delay = millis - now;
                if (delay <= 0) {
                    break;
                }
                wait(delay);
                now = System.currentTimeMillis() - base;
            }
        }
    }
注意:join()无参形式等价于join(0),wait()类似
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值