zoukankan      html  css  js  c++  java
  • java多线程----LockSupport

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

    LockSupport是通过调用Unsafe函数中的接口实现阻塞和解除阻塞的。

    public class WaitTest1 {
    
        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();    // 唤醒“当前对象上的等待线程”
                }
            }
        }
    }
    package com.test;
    import java.util.concurrent.locks.LockSupport;
    
    public class LockSupportTest1 {
    
        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.unpark(mainThread);
            LockSupport.park(mainThread);  //前面umpark了,着你不会阻塞
            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);
            }
        }
    }

     park和wait的区别。wait让线程阻塞前,必须通过synchronized获取同步锁。

  • 相关阅读:
    Office相关
    Eclipse常用设置
    Google logos 纪念电吉他大师莱斯·保罗(LesPaul)演示
    强烈推荐SQL Prompt 3.8,并发布SQL Prompt 3.8 ,SQL Refator 的xxx
    C#命令行编辑器csc.exe
    JSP中文乱码问题 页面经过过滤器后得到的是中文,但插入到MYSQL数据库却成了“?”为什么?
    (转贴)来谈谈SQL数据库中"简单的"SELECT TOP—可能有你从未注意到的细节
    C#Winform限制Textbox只能输入数字
    VPC2007虚拟机与主机的互连互通方法
    邮件会消亡是无稽之谈
  • 原文地址:https://www.cnblogs.com/yaowen/p/9334033.html
Copyright © 2011-2022 走看看