首页 > 其他分享 >wait、sleep、yield、join的区别

wait、sleep、yield、join的区别

时间:2023-09-16 20:23:23浏览次数:34  
标签:join 队列 yield sleep 线程 CPU wait

两个概念

1、锁队列

所有需要竞争同步锁的线程都会放在锁队列中,比如当前对象的锁已经被一个线程得到,则其他线程都需要在这个锁队列中进行等待,当前面的线程释放同步锁后,锁队列中的线程去竞争同步锁,当某个线程得到后会进入就绪队列进行等待CPU资源分配。

2、等待队列(wait方法)

在调用wait() 方法后,线程会放到等待队列中,等待队列的线程是不会去竞争同步锁的。只有调用了 notify() 或 notifyAll() 后等待队列的线程才会开始去竞争锁,notify() 是随机从等待队列中选出一个线程放到锁队列中,而notifyAll() 是将等待队列中的所有线程都放到锁队列中。

wait 和 sleep 的区别

  1. sleep 是 Thread 类的静态本地方法,wait 是 Object 类的本地方法。

  2. sleep 不会释放锁资源,但wait 会释放锁资源,而且会加入到锁等待队列中。

    sleep 就是把 CPU 的执行资格和执行权释放出去,不会再执行此线程,当定时时间结束后再取回CPU资源,参与CPU的调度,获取CPU资源后就可以继续运行、而如果 sleep 的时候该线程有锁,那么 sleep 不会释放这个锁,而是把锁带着一起进入睡眠状态,也就是说其他需要这个锁的线程根本不可能获得这个锁。如果在睡眠期间其他线程调用了这个线程 interrupt 方法,那么这个线程也会抛出 interruptException 异常返回,这点和 wait 是一样的。

  3. sleep 方法不依赖于同步器 synchronized ,但是 wait 方法需要依赖 synchronized 关键字一起才能执行。

  4. sleep 不需要被唤醒(休眠之后退出阻塞),但是 wait 需要被 notify() 或 notifyAll() 唤醒。

  5. sleep 一般用于当前线程休眠,或者轮休暂停操作,而 wait 多用于多线程直接的通信。

  6. sleep 会让出CPU执行时间且强制上下文切换,而 wait 则不一定,wait 后可能还是有机会重新竞争到锁继续执行。

yield

yield() 执行后线程直接进入就绪状态,马上释放了CPU的执行权,但是依然保留了CPU的执行资格,有可能在CPU下次进行线程调度时还让这个线程获取到执行权继续执行。

join

join() 执行后线程进入阻塞状态,例如在线程B中调用线程A的 join() 方法,那么线程B会进入到阻塞队列,直到线程A结束或者中断线程。

public class ThreadJoin extends Thread {
    private int i = 1;

    @Override
    public void run() {
        for (; i < 10; i++) {
            System.out.println(getName() + " " + i);
        }
    }

    public static void main(String[] args) throws InterruptedException {
        for (int i = 0; i < 20; i++) {
            System.out.println(Thread.currentThread().getName() + " " + i);
            if (i == 5) {
                ThreadJoin t1 = new ThreadJoin();
                t1.start();
                //main 线程调用了t1 线程的join() 方法,所以必须等t1 执行结束才会向下执行
                t1.join();
            }
        }
    }
}

标签:join,队列,yield,sleep,线程,CPU,wait
From: https://www.cnblogs.com/luler/p/17707244.html

相关文章

  • os.path.join可以自动处理不合理的地址拼接
    结论:os.path.join比'\\'.join([])智能的地方在于os.path.join可以自动处理不合理的地址拼接截图:......
  • 无涯教程-JavaScript - YIELDDISC函数
    描述YIELDDISC函数返回打折证券的年收益。语法YIELDDISC(settlement,maturity,pr,redemption,[basis])争论Argument描述Required/OptionalSettlement证券的结算日期。证券结算日期是指在发行日期之后将证券交易给买方的日期。RequiredMaturity证券的到期......
  • 无涯教程-JavaScript - YIELD函数
    描述YIELD函数返回定期付息的证券的收益率。使用YIELD计算债券收益率。语法YIELD(settlement,maturity,rate,pr,redemption,frequency,[basis])争论Argument描述Required/OptionalSettlement证券的结算日期。证券结算日期是指在发行日期之后将证券交易给买方......
  • Java多线程____线程yield方法介绍
    packagecom.test.thread;publicclassTestYield{ publicstaticvoidmain(String[]args){ TestThreadt1=newTestThread("A_01"); TestThreadt2=newTestThread("B_02"); t1.start(); t2.start(); }}classTestThreadextend......
  • Java多线程____线程状态Join()方法
    代码:packagecom.test.thread;publicclassTestRunnableimplementsRunnable{ @Override publicvoidrun(){ synchronized(this){ for(inti=0;i<10;i++){ System.out.println(Thread.currentThread().getName()); } } } }packagecom......
  • Java多线程____线程状态Sleep()方法
    Sleep():在指定的毫秒数内让当前正在执行的线程休眠调用sleep方法时使当前的线程进入休眠状态(阻塞状态)设定休眠xxxx毫秒数后进入运行状态同步块中的Sleep方法调用不会释放对象锁但调用wait()方法会释放对象的同步锁packagecom.test.thread;publicclassTestRunnableimpleme......
  • 25进程/join方法/互斥锁
    代码创建进程"""创建进程的方式有哪些1.鼠标双击桌面一个应用图标2.代码创建创建进程的本质:在内存中申请一块内存空间用于运行相应的程序代码"""#第一种创建进程的方式》》对象#frommultiprocessingimportProcess#importtime###deftask(name)......
  • 为什么使用图进行关联运算比表Join更具吸引力?
    GeaFlow(品牌名TuGraph-Analytics)已正式开源,欢迎大家关注!!!欢迎给我们Star哦!GitHub......
  • 在thinkphp6中使用leftJoin时,怎么使用REPLACE?
    在ThinkPHP6中,你可以使用db()函数来构建复杂的SQL查询,以实现JOIN并使用REPLACE函数。可以按照以下方式修改你的代码:$res->leftJoin('work','work.workID=REPLACE(entry_in.workID,"JP","")')->where('work.customer_id',$customer_id);在这......
  • ClickHouse的Join算法
    ClickHouse的Join算法ClickHouse是一款开源的列式分析型数据库(OLAP),专为需要超低延迟分析查询大量数据的场景而生。为了实现分析应用可能达到的最佳性能,分析型数据库(OLAP)通常将表组合在一起形成一个大宽表,这个过程称为数据反规范化(datadenormalization)。大宽表通过避免JOIN连接来......