• 同步模式之保护性暂停模式


    1. Guarded Suspension:一个线程需要等待另一个线程的执行结果

    2. 理解

    • 一个线程需要将结果传递给另一个线程,将这两个线程关联到到同一个 GuardedObject 

    • 如果需要源源不断地传递结果,需要使用消息队列(生产者-消费者模型)
    • JDK 中,join 的实现、Future 的实现用的都是保护性暂停模式
    • 因为要等待,所以算作同步模式

    3. 实现

    • 创建两个线程和一个守护对象,线程 1 wait 等待下载结果 response,线程 2 执行下载,下载完成将结果赋值给 GuardedObject 的 response 属性,然后 notify 唤醒线程 1,线程 1 被唤醒,继续执行,两个线程通过 GuardedObject 传递要用的结果

    4. 优点

    • join 需要等一个线程运行结束了才能得到该线程的结果
    • join 等待结果的变量只能是全局的,GuardedObject 可以是局部的

    5. 扩展 1

    • 超时退出:wait(timeout) 只等待一段时间,如果超时了还没有获取到结果就直接退出循环

    (resposne 是下载完成之后赋值的,response 不为空之后就可以退出循环,返回 res) 

    6. join 的原理:保护性暂停是等待一个线程的结果,join 是等待一个线程的结束

    • 就是应用了保护性暂停模式,如果线程还存活(对应上面的下载结果 response == null)且未超时就一直等待,如果超时了(还没有得到结果)就退出循环
    1. /**
    2. * Waits at most {@code millis} milliseconds for this thread to
    3. * die. A timeout of {@code 0} means to wait forever.
    4. *
    5. *

      This implementation uses a loop of {@code this.wait} calls

    6. * conditioned on {@code this.isAlive}. As a thread terminates the
    7. * {@code this.notifyAll} method is invoked. It is recommended that
    8. * applications not use {@code wait}, {@code notify}, or
    9. * {@code notifyAll} on {@code Thread} instances.
    10. *
    11. * @param millis
    12. * the time to wait in milliseconds
    13. *
    14. * @throws IllegalArgumentException
    15. * if the value of {@code millis} is negative
    16. *
    17. * @throws InterruptedException
    18. * if any thread has interrupted the current thread. The
    19. * interrupted status of the current thread is
    20. * cleared when this exception is thrown.
    21. */
    22. public final synchronized void join(long millis)
    23. throws InterruptedException {
    24. long base = System.currentTimeMillis();
    25. long now = 0;
    26. if (millis < 0) {
    27. throw new IllegalArgumentException("timeout value is negative");
    28. }
    29. if (millis == 0) {
    30. while (isAlive()) {
    31. wait(0);
    32. }
    33. } else {
    34. while (isAlive()) {
    35. long delay = millis - now;
    36. if (delay <= 0) {
    37. break;
    38. }
    39. wait(delay);
    40. now = System.currentTimeMillis() - base;
    41. }
    42. }
    43. }

    7. 扩展2:生产者消费者节耦 

  • 相关阅读:
    HTML登录页面
    JOSEF电流继电器 DL-33 整定范围0.5-2A 柜内安装板前接线
    百度网盘开放接口
    数据预处理之后,将数据保存到文件中时报错:找不到文件名,如何解决?
    右击图片出现Microsoft WinRT Storage API,点击提示找不到元素的解决思路
    数据结构—LinkedList与链表
    Python模块之time中时间戳、时间字符与时间元组之间的相互转换
    Gson解析会丢失默认属性值
    驱动程序开发:Linux内核自带LED使能
    javaSE--数据类型(复习)
  • 原文地址:https://blog.csdn.net/m0_74059961/article/details/140052907