Java多线程 Guarded Suspension设计模式

 更新时间:2021年10月28日 11:46:50   作者:冬日毛毛雨  
这篇文章主要介绍了Java多线程 Guarded Suspension设计模式,Guarded Suspension意为保护暂停,其核心思想是仅当服务进程准备好时,才提供服务,文章围绕Java多线程 Guarded Suspension展开内容,需要的朋友可以参考一下

前言:

Guarded Suspension意为保护暂停,其核心思想是仅当服务进程准备好时,才提供服务。设想一种场景,服务器可能会在很短时间内承受大量的客户端请求,客户端请求的数量可能超过服务器本身的即时处理能力,而服务端程序又不能丢弃任何一个客户请求。此时,最佳的处理方案莫过于让客户端要求进行排队,由服务端程序一个接一个处理。这样,既保证了所有的客户端请求均不丢失,同时也避免了服务器由于同时处理太多的请求而崩溃

1.Guarded Suspension模式的结构

Guarded Suspension模式的主要成员有:RequestRequestQueueClientThreadServerThread

  • Request:表示客户端请求
  • RequestQueue:用于保存客户端请求队列
  • ClientThread:客户端进程
  • ServerThread:服务器进程

其中,ClientThread负责不断发起请求,并将请求对象放入请求队列。ServerThread则根据其自身的状态,在有能力处理请求时,从RequestQueue中提取请求对象加以处理。

从流程图中可以看到,客户端的请求数量超过了服务线程的能力。在频繁的客户端请求中,RequestQueue充当了中间缓存,存放未处理的请求,保证了客户请求不丢失,同时也保护了服务线程不会受到大量并发的请求,而导致计算机资源不足

2. Guarded Suspension模式的简单实现

public class ClientThread extends Thread {

    private final RequestQueue queue;

    private final Random random;

    private final String sendValue;

    public ClientThread(RequestQueue queue, String sendValue) {
        this.queue = queue;
        this.sendValue = sendValue;
        this.random = new Random(System.currentTimeMillis());
    }

    @Override
    public void run() {

        for (int i = 0; i < 10; i++) {
            System.out.println("Client -> request " + sendValue);
            queue.putRequest(new Request(sendValue));

            try {
                Thread.sleep(random.nextInt(1000));
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }
}
public class Request {

    private final String value;

    public Request(String value) {
        this.value = value;
    }

    public String getValue() {
        return value;
    }
}
public class RequestQueue {

    private final LinkedList<Request> queue = new LinkedList<>();

    public Request getRequest() {
        synchronized (queue) {
            while (queue.size() <= 0) {
                try {
                    queue.wait();
                } catch (InterruptedException e) {
                    return null;
                }
            }
            return queue.removeFirst();
        }
    }

    public void putRequest(Request request) {

        synchronized (queue) {
            queue.addLast(request);
            queue.notifyAll();
        }
    }
}

public class ServerThread extends Thread {

    private final RequestQueue queue;

    private final Random random;

    private volatile boolean closed = false;

    public ServerThread(RequestQueue queue) {
        this.queue = queue;
        random = new Random(System.currentTimeMillis());
    }

    @Override
    public void run() {

        while (!closed) {
            Request request = queue.getRequest();
            if (null == request) {
                System.out.println("Received the empty request.");
                continue;
            }
            System.out.println("Server ->" + request.getValue());
            try {
                Thread.sleep(random.nextInt(1000));
            } catch (InterruptedException e) {
                return;
            }
        }
    }

    public void close() {
        this.closed = true;
        this.interrupt();
    }
}

public class SuspensionClient {
    public static void main(String[] args) throws InterruptedException {

        final RequestQueue queue = new RequestQueue();
        new ClientThread(queue,"Jack").start();
        ServerThread serverThread =  new ServerThread(queue);
        serverThread.start();

        Thread.sleep(10000);
        serverThread.close();
    }
}

运行:

Client -> request Jack
Server ->Jack
Client -> request Jack
Server ->Jack
Client -> request Jack
Server ->Jack
Client -> request Jack
Server ->Jack
Client -> request Jack
Client -> request Jack
Client -> request Jack
Server ->Jack
Client -> request Jack
Client -> request Jack
Server ->Jack
Client -> request Jack
Server ->Jack
Server ->Jack
Server ->Jack
Server ->Jack
Received the empty request.

到此这篇关于Java多线程 Guarded Suspension设计模式的文章就介绍到这了,更多相关Java多线程 Guarded Suspension内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Java编程—在测试中考虑多态

    Java编程—在测试中考虑多态

    这篇文章主要介绍了Java编程—在测试中考虑多态,具有一定参考价值,需要的朋友可以了解下。
    2017-11-11
  • Sentinel自定义异常的三种实现方式

    Sentinel自定义异常的三种实现方式

    Spring Cloud Alibaba Sentinel 是目前主流并开源的流量控制和系统保护组件,Spring Cloud Alibaba Sentinel 有 3 种自定义异常的实现方式,本文小编将通过代码示例给大家详细的介绍这三种实现方式,需要的朋友可以参考下
    2023-11-11
  • Quarkus中ConfigSourceInterceptor的加密配置实现

    Quarkus中ConfigSourceInterceptor的加密配置实现

    这篇文章主要为大家介绍Quarkus中ConfigSourceInterceptor加密配置的实现方式,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-02-02
  • java 中ThreadPoolExecutor原理分析

    java 中ThreadPoolExecutor原理分析

    这篇文章主要介绍了java 中ThreadPoolExecutor原理分析的相关资料,需要的朋友可以参考下
    2017-03-03
  • SpringBoot生成PDF的五种实现方法总结

    SpringBoot生成PDF的五种实现方法总结

    这篇文章主要介绍了SpringBoot生成PDF的五种实现方法,在开发中经常会遇到需要进行对一些数据进行动态导出PDF文件,然后让用户自己选择是否需要打印出来,这篇文章我们来介绍五种实现方法,需要的朋友可以参考下
    2024-10-10
  • Spring框架学习之AOP详解

    Spring框架学习之AOP详解

    这篇文章主要介绍了Spring框架学习之AOP详解,文中有非常详细的代码示例,对正在学习Spring框架的小伙伴们有一定的帮助,需要的朋友可以参考下
    2021-05-05
  • Java分布式锁的概念与实现方式详解

    Java分布式锁的概念与实现方式详解

    今天小编就为大家分享一篇关于Java分布式锁的概念与实现方式详解,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
    2019-01-01
  • String转JSONObject的两种方式

    String转JSONObject的两种方式

    这篇文章主要介绍了String转JSONObject,本文通过实例代码给大家介绍两种方式转换,结合实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2023-07-07
  • 将应用程序进行Spring6迁移的最佳使用方式

    将应用程序进行Spring6迁移的最佳使用方式

    这篇文章主要介绍了将应用程序进行Spring6迁移的最佳方式,以及如何充分利用此升级,需要的朋友可以参考下,如有错误的地方还请指正
    2023-03-03
  • Java实现动态验证码生成

    Java实现动态验证码生成

    这篇文章主要为大家详细介绍了Java实现动态验证码生成,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-04-04

最新评论