线程唤醒机制

导读:本篇文章讲解 线程唤醒机制,希望对大家有帮助,欢迎收藏,转发!站点地址:www.bmabk.com

一、wait和notify实现等待和唤醒

要在 synchronized 锁中使用,切先等待才能进行唤醒

        Object object = new Object();
        Thread t1 = new Thread(() -> {
            synchronized (object) {
                try {
                    System.out.println("================进入线程=============");
                    object.wait();
                    System.out.println("================线程被唤醒=============");
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        },"t1");
        t1.start();
        try {
            TimeUnit.SECONDS.sleep(3);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        new Thread(() ->{
            synchronized (object){
                object.notify();
                System.out.println("进行唤醒==============");
            }
        },"t2").start();

二、await和signal实现等待和唤醒

需要在lock下使用,配合condition 实现,先等待才能进行唤醒

        Lock lock = new ReentrantLock();
        Condition condition = lock.newCondition();
        Thread t1 = new Thread(() -> {
            lock.lock();
            try{
                System.out.println("=============进入方法==============");
                condition.await();
                System.out.println("=================线程被唤醒=================");
            }catch (Exception e){
                e.printStackTrace();
            }finally {
                lock.unlock();
            }
        }, "t1");
        t1.start();
        try {
            TimeUnit.SECONDS.sleep(2);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        new Thread(() ->{
            lock.lock();
            try{
                condition.signal();
                System.out.println("=============唤醒操作================");
            }catch (Exception e){
                e.printStackTrace();
            }finally {
                lock.unlock();
            }
        },"t2").start();

三、park和unpark实现等待和唤醒

unpark进行许可证的发布:最多只能发布一张许可证(不会累积)。如果一个方法出现两次LockSupport.park();就会出现问题。

基于LockSupport实现,无顺序要求,可以先park也可以先unpark。底层基于UNSAFE类实现

        Thread t1 = new Thread(() -> {
            System.out.println("===============进入线程执行=====================");
            LockSupport.park();
            System.out.println("===============线程被唤醒=====================");
        }, "t1");
        t1.start();
        try {
            TimeUnit.SECONDS.sleep(2);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        new Thread(() ->{
            LockSupport.unpark(t1);
            System.out.println("================进行唤醒==================");
        },"t2").start();

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/96968.html

(0)
小半的头像小半

相关推荐

极客之音——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!