当前位置: 首页 > news >正文

软件ui信息流广告优化师培训

软件ui,信息流广告优化师培训,3322怎么做网站,wix怎么做网页文章目录 1. 线程通信2. Object类中的wait和notify方法实现等待和唤醒3. Condition接口中的await和signal方法实现等待和唤醒4. LockSupport实现等待和唤醒4.1 优点 1. 线程通信 多个线程在处理同一个资源,但是处理的动作(线程的任务)却不相…

文章目录

    • 1. 线程通信
    • 2. Object类中的wait和notify方法实现等待和唤醒
    • 3. Condition接口中的await和signal方法实现等待和唤醒
    • 4. LockSupport实现等待和唤醒
      • 4.1 优点

1. 线程通信

多个线程在处理同一个资源,但是处理的动作(线程的任务)却不相同,于是这些线程之间就存在通信问题,称为线程间通信。

比如:生产者消费者问题。

当多个线程间存在通信问题时,我们希望它们能有规律地执行,因此就需要一些协调手段,其中,等待唤醒机制就是协调线程间通信的一种有效手段。

2. Object类中的wait和notify方法实现等待和唤醒

  • wait和notify方法必须在同步块或者方法里面使用,且成对出现
  • 必须先wait后notify才OK
public static void main(String[] args) {Object monitor = new Object();new Thread(() -> {synchronized (monitor) {System.out.println("线程1执行");try {monitor.wait();} catch (InterruptedException e) {throw new RuntimeException(e);}}}).start();try {TimeUnit.SECONDS.sleep(1);} catch (Exception e) {e.printStackTrace();}new Thread(() -> {System.out.println("线程2执行");synchronized (monitor) {monitor.notify();}}).start();
}

3. Condition接口中的await和signal方法实现等待和唤醒

  • Condition中的线程等待和唤醒方法,需要先获取锁
  • 一定要先await后signal
public static void main(String[] args) {Lock lock = new ReentrantLock();Condition condition = lock.newCondition();new Thread(() -> {System.out.println("线程1执行");lock.lock();try{condition.await();System.out.println("线程1被唤醒");} catch (Exception e) {e.printStackTrace();} finally {lock.unlock();}}).start();try {TimeUnit.SECONDS.sleep(1);} catch (Exception e) {e.printStackTrace();}new Thread(() -> {System.out.println("线程2执行");lock.lock();try{condition.signal();} catch (Exception e) {e.printStackTrace();} finally {lock.unlock();}}).start();
}

4. LockSupport实现等待和唤醒

LockSupport类使用了一种名为Permit(许可)的概念来做到阻塞和唤醒线程的功能,每个线程都有一个permit。但与Semaphore不同的是,许可的累加上限是1

  • park():permit许可证默认没有,所以一开始调用park()方法当前线程就会阻塞,直到别的线程给该线程发放permit,该线程才会被唤醒
  • unpark(thread):发放permit许可证给对应线程thread
  • 满足 正常阻塞唤醒要求,无锁块要求;且支持先唤醒后等待
public static void main(String[] args) {Thread t1 = new Thread(() -> {System.out.println("线程1执行");LockSupport.park();System.out.println("线程1被唤醒");});t1.start();try {TimeUnit.SECONDS.sleep(1);} catch (Exception e) {e.printStackTrace();}new Thread(() -> {System.out.println("线程2执行");LockSupport.unpark(t1);}).start();
}

4.1 优点

为什么推荐使用LockSupport来做线程的阻塞与唤醒(线程间协同工作),因为它具备如下优点

  • 以线程为操作对象更符合阻塞线程的直观语义
  • 操作更精准,可以准确地唤醒某一个线程(notify随机唤醒一个线程,notifyAll唤醒所有等待的线程)
  • 无需竞争锁对象(以线程作为操作对象),不会因竞争锁对象产生死锁问题
  • unparkpark没有严格的执行顺序,不会因执行顺序引起死锁问题,比如「Thread.suspendThread.resume」没按照严格顺序执行,就会产生死锁

另外LockSupport还提供了park的重载函数,提升灵活性

  • void parkNanos(long nanos):增加了超时机制
  • void parkUntil(long deadline):加入超时机制(指定到某个时间点,1970年到指定时间点的毫秒数)
  • void park(Object blocker):设置blocker对象,当线程没有许可证被阻塞时,该对象会被记录到该线程的内部,方便后续使用诊断工具进行问题排查
  • void parkNanos(Object blocker, long nanos):设置blocker对象,加入超时机制
  • void parkUntil(Object blocker, long deadline):设置blocker对象,加入超时机制(指定到某个时间点,1970年到指定时间点的毫秒数)

建议使用时,传入blocker对象,至于超时根据业务场景选择

http://www.khdw.cn/news/62318.html

相关文章:

  • 广告行业做网站哪个好推广普通话奋进新征程
  • 通过网站如何做海外贸易平台开发
  • 电商网站的在线客服怎么做做网站排名服务热线
  • 潍坊建设厅网站win10系统优化
  • 如何说明学校网站建设情况结构优化是什么意思
  • 企业宣传片策划制作太原seo快速排名怎么样
  • 武汉建设学校官网承德seo
  • 庞各庄网站建设公司怎么在百度推广自己的公司
  • 云浮各类免费建站百度广告联盟一个月能赚多少
  • wordpress录音功能搜索引擎优化的内部优化
  • app制作器下载软件seo小白入门
  • 购物网站建设课程设计建立免费个人网站
  • 龙岩58同城seo优化是什么意思
  • 怎么做服装外贸网站百度下载安装最新版
  • 个人 网站备案交换链接的例子
  • 有没有专门做艺术的网站免费自助建站
  • 店铺网站域名怎么做做网络推广有前途吗
  • asia 域名 知名网站建立网站的基本步骤
  • 作业网站建设方案百度经验悬赏任务平台
  • 什么是门户网站东莞网站seo优化
  • 推荐个做淘宝主图视频的网站百度关键词收录排名
  • 湖州网络推广竞价搜索引擎优化论文3000字
  • 沧州wap网站制作长春关键词搜索排名
  • 上传网站到百度百度在线下载
  • 如今做那个网站能致富域名权重
  • 餐饮网站建设怎样专业seo站长工具
  • 网站建设代理上海培训机构排名
  • 专业做电脑系统下载网站好常州seo关键词排名
  • 自己做网站需不需要钱bing搜索引擎入口
  • 商务电子是学什么的武汉做seo