• thread_LockSupport


    LockSupport是用来创建锁和其他同步类的基本线程阻塞原语。
    LockSupport中的park() 和 unpark() 的作用分别是阻塞线程和解除阻塞线程,而且park()和unpark()不会遇到“Thread.suspend 和 Thread.resume所可能引发的死锁”问题。
    因为park() 和 unpark()有许可的存在;调用 park() 的线程和另一个试图将其 unpark() 的线程之间的竞争将保持活性。

    简单来说:从表面看到的现象就是:调用object的wait需要有一个监视器对象,否则抛出异常,而LockSupport不需要,可以直接针对某个线程使用该效果

    public class LockSupport2Test {
    
        private static Thread mainThread;
    
        public static void main(String[] args) {
            ThreadA ta = new ThreadA("ta");
            // 获取主线程
            mainThread = Thread.currentThread();
            System.out.println(Thread.currentThread().getName() + " start ta");
            ta.start();
    
            System.out.println(Thread.currentThread().getName() + " block");
            // 主线程阻塞
            LockSupport.park(mainThread);
            System.out.println(Thread.currentThread().getName() + " continue");
        }
    
        static class ThreadA extends Thread {
    
            public ThreadA(String name) {
                super(name);
            }
            public void run() {
                System.out.println(Thread.currentThread().getName() + " wakup others");
                // 唤醒“主线程”
                LockSupport.unpark(mainThread);
            }
        }
    }
        public static void main(String[] args) {
    
            ThreadA ta = new ThreadA("ta");
    
            synchronized (ta) { // 通过synchronized(ta)获取“对象ta的同步锁”
                try {
                    System.out.println(Thread.currentThread().getName() + " start ta");
                    ta.start();
    
                    System.out.println(Thread.currentThread().getName() + " block");
                    // 主线程等待
                    ta.wait();
    
                    System.out.println(Thread.currentThread().getName() + " continue");
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        }
    
        static class ThreadA extends Thread {
            public ThreadA(String name) {
                super(name);
            }
    
            public void run() {
                synchronized (this) { // 通过synchronized(this)获取“当前对象的同步锁”
                    System.out.println(Thread.currentThread().getName() + " wakup others");
                    notify(); // 唤醒“当前对象上的等待线程”
                }
            }
        }
  • 相关阅读:
    JAVA8 之 Stream 流(四)
    关于iphone 6s 页面功能不能正常使用问题
    关于ES6语法的 一些新的特性
    微信授权一直跳转
    js 一道题目引发的正则的学习
    关于this在不同使用情况表示的含义
    详细解析arry.map() ,function.apply() 方法
    关于服务器无法在已发送http表头之后设置状态问题
    七牛上传视频并转码
    使用 v-cloak 防止页面加载时出现 vuejs 的变量名
  • 原文地址:https://www.cnblogs.com/dengzy/p/5819017.html
Copyright © 2020-2023  润新知