zoukankan      html  css  js  c++  java
  • 线程阻塞工具类:LockSupport(读书笔记)

     他可以在线程任意位置让线程阻塞,
    LockSupport的静态方法park()可以阻塞当前线程,类似的还有parkNanos() ParkUntil()等,他们实现了一个限时等待
    public class LockSupportDemo {
        public static Object u = new Object();
        static ChangeObjectThread t1 = new ChangeObjectThread("t1");
        static ChangeObjectThread t2 = new ChangeObjectThread("t2");
    
        public static class ChangeObjectThread extends Thread {
            public ChangeObjectThread(String name) {
                super.setName(name);
            }
    
            public void run() {
                synchronized (u) {
                    System.out.println("in" + getName());
                    LockSupport.park();
                }
            }
        }
    
        public static void main(String[] args) throws InterruptedException {
            t1.start();
            Thread.sleep(100);
            t2.start();
            LockSupport.unpark(t1);
            LockSupport.unpark(t2);
            t1.join();
            t2.join();
        }
    }
         我们可以使用park()和unpark()方法替换掉以往的suspend()和resume()方法.当然我们依然无法保证unpark()方法发生在park(0方法之后,当时执行这段代码,你会发现,它自始至终都可以正常结束,不会因为park()方法二导致线程永久性的挂起,
         这是因为LockSupport类使用类似信号量的机制,他为每一个线程准备了一个许可.这个特点使得:即使unpark()操作发生在park()之前,它也可以使下一次的park()操作立即返回.这也就是上述代码可顺利结束的主要原因.
         出来有定时阻塞的功能外,还支持中断影响,但是和其他接收中断函数不一样,他不会抛出InterruptedException异常,他只会默默的返回,但是我们可以从Thread.Interrupted()等方法获得中断标记.
    public class LockSupportIntDemo {
        public static Object u = new Object();
        static ChangeObjectThread t1 = new ChangeObjectThread("t1");
        static ChangeObjectThread t2 = new ChangeObjectThread("t2");
    
        public static class ChangeObjectThread extends Thread {
            public ChangeObjectThread(String name) {
                super.setName(name);
            }
    
            public void run() {
                synchronized (u) {
                    System.out.println("in " + getName());
                    LockSupport.park();
                    if (Thread.interrupted()) {
                        System.out.println(getName() + " 被中断了!");
                    }
                }
                System.out.println(getName() + " 执行结束");
            }
        }
    
        public static void main(String[] args) throws InterruptedException {
            t1.start();
            Thread.sleep(100);
            t2.start();
            t1.interrupt();
            LockSupport.unpark(t2);
        }
    }
     
  • 相关阅读:
    slice和splice的区别
    Js中获取对象的所有key值
    设置layUI的时间laydate 结束时间大于开始时间
    vscode前端常用插件推荐,搭建JQuery、Vue等开发环境
    安装vue脚手架
    es6中...是什么意思
    html转义字符换行以及回车等的使用
    10款让人惊叹的HTML5/jQuery图片动画特效
    基于GIS技术的水利一张图平台
    BIM + 3D GIS在岩溶强发育区跨海盾构隧道施工中的实践应用
  • 原文地址:https://www.cnblogs.com/ten951/p/6212171.html
Copyright © 2011-2022 走看看