zoukankan      html  css  js  c++  java
  • 05.线程在睡眠时拥有的监视器资源不会被释放(这里使用重入锁ReentrantLock)

    import java.util.concurrent.locks.Lock;
    import java.util.concurrent.locks.ReentrantLock;
    
    public class SleepDemo {
        //创建一个独占锁
        private static final Lock lock = new ReentrantLock();
        public static void main(String[] args) throws InterruptedException{
            //线程在睡眠时拥有的监视器资源不会被释放
            Thread threadA = new Thread(new Runnable() {
                @Override
                public void run() {
                    //获取独占锁
                    lock.lock();
                    try {
                        System.out.println("threadA is in sleep");
                        Thread.sleep(10000);
                        System.out.println("threadA is in waked");
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }finally {
                        //释放锁
                        lock.unlock();
                    }
                }
            });
            Thread threadB = new Thread(new Runnable() {
                @Override
                public void run() {
                    //获取独占锁
                    lock.lock();
                    try {
                        System.out.println("threadB is in sleep");
                        Thread.sleep(10000);
                        System.out.println("threadB is in waked");
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }finally {
                        //释放锁
                        lock.unlock();
                    }
                }
            });
    //        threadA.start();
    //        threadB.start();
            //threadA is in sleep
            //threadA is in waked
            //threadB is in sleep
            //threadB is in waked
            //线程 A 先获取了锁,那么线程 A 会先输出一行,然后调用 sleep 方法让自己睡眠 10s,
            //在线程 A 睡眠的这 10s 内那个独占锁 lock 还是线程 A 自己持有,线程 B 会一直阻塞直到线程 A 醒来后执行 unlock 释放锁
    
            final Thread thread = new Thread(new Runnable() {
                @Override
                public void run() {
                    try {
                        System.out.println("thread is in sleep");
    //                    Thread.sleep(10000);
                        Thread.sleep(-1);
                        System.out.println("thread is in waked");
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
            });
            thread.start();
            Thread.sleep(2000);
            //主线程中断子线程
            //thread is in sleep
            //java.lang.InterruptedException: sleep interrupted
            thread.interrupt();
            //子线程在睡眠期间, 主线程中断了它,所以子线程在调用 sleep 方法处抛出了 InterruptedException 异常
    
            //sleep为负数
            //thread is in sleep
            //Exception in thread "Thread-2" java.lang.IllegalArgumentException: timeout value is negative
        }
    }
    
  • 相关阅读:
    Excel基础—文件菜单之创建保存
    Excel技巧—名称框的妙用
    Excel基础—文件菜单之设置信息
    Excel基础—文件菜单之打印共享账户
    Excel基础—文件菜单之设置选项
    Excel基础—工作界面概述
    linux环境下pathinfo 工作失败的改进函数
    javascript为网页元素绑定click事件
    将纯真ip数据库解析并导入mysql数据库中
    pgsql导入和导出数据
  • 原文地址:https://www.cnblogs.com/fly-book/p/11361795.html
Copyright © 2011-2022 走看看