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

建设无障碍网站怎么让网站栏目页收录

建设无障碍网站,怎么让网站栏目页收录,怎么自己创立网站,外贸类网站模板文章目录 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.yayakq.cn/news/298465/

相关文章:

  • 传奇网站制作网青海农业网站建设公司
  • 网站建设犀牛邯郸大网站
  • 江苏省品牌专业建设网站六一儿童节网站制作
  • 做网站太累成都龙泉建设有限公司网站
  • 三把火科技网站设计湖南省建设厅城乡建设网站
  • 网站建设中的主要功能广州市建筑业联合会
  • 广州建站网络公司自己的商品链接怎么弄
  • 沃尔玛公司网站建设案例分析黄岛王台有做网站的吗
  • 在那个网站可以搜索做凉菜视频西安高端网站建设公司
  • 苏州免费模板建站产品开发设计流程图
  • 主营商城网站建设wordpress 用户修改密码
  • 榆林市横山县建设局官方网站更新wordpress图片地址
  • 做音乐相册的网站买东西哪个平台质量好
  • 昆明做个人网站wordpress centos安装
  • 手机网站制作代码wordpress4.7.4
  • 自己做头像的网站漫画移动端网站制作
  • seo网站推广实例网站开发南昌
  • 网站建设文件夹布局php网站开发招聘
  • 哈尔滨专业网站制作设计茶酒行业网站建设
  • 筑巢网站建设怎么用虚拟主机做网站
  • 网站直播间怎么做wordpress 接入外网就快
  • 网站 免费空间网站域名备案在哪里
  • 网站中的分享怎么做Wordpress主题 魔兽
  • 传奇网站模块下载哪里有免费的网站自己做
  • 好看的网站后台模板全国最好的网站建设案例
  • 网站开发 入门 pdf公司建网站多少
  • 做外贸网站平台有哪些内容河南建筑材料价格信息网
  • 网站建设找酷风网页设计与制作教程资源
  • 做网站怎么安装数据库WordPress 经典编辑器
  • 电商网站建设与维护试题广州网页制作培训