千家信息网

Java多线程如何使用Guarded Suspension设计模式

发表于:2025-02-23 作者:千家信息网编辑
千家信息网最后更新 2025年02月23日,这篇文章主要介绍"Java多线程如何使用Guarded Suspension设计模式",在日常操作中,相信很多人在Java多线程如何使用Guarded Suspension设计模式问题上存在疑惑,小编
千家信息网最后更新 2025年02月23日Java多线程如何使用Guarded Suspension设计模式

这篇文章主要介绍"Java多线程如何使用Guarded Suspension设计模式",在日常操作中,相信很多人在Java多线程如何使用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 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设计模式"的学习就结束了,希望能够解决大家的疑惑。理论与实践的搭配能更好的帮助大家学习,快去试试吧!若想继续学习更多相关知识,请继续关注网站,小编会继续努力为大家带来更多实用的文章!

客户 服务 客户端 模式 处理 线程 设计模式 设计 服务器 学习 同时 能力 进程 对象 数量 更多 程序 队列 保护 保证 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 教育局软件开发 数据库设计范例 软件开发适合i5还是i7 台站数据库抽检报告范文 计算机网络技术专业是工科吗 数据库域能不能有组合数据 网络安全宣传周网络大v 天龙八部鸿运当头是哪个服务器 服务器插内存条的位置 域名和服务器是一样的吗 数据库与数据库关联查询语句 网络安全面临怎样的挑战 广州拓扑网络技术有限公司品牌 网络安全教育平台网址 公司内网 网络安全部 网络安全片讲述了什么 如何查看自己手机服务器ip vnc服务器密钥许可 浙江大学网络技术中心 两个数据库之间导数据方法 华夏恒生互联网科技etf场内 网络安全的本质是对抗 最易学软件开发入门 关于网络安全的画A3 江苏极光网络技术有限责任公司 网络安全制度的内容 手游服务器延迟解决方法 网络安全案例题库 dellt610服务器黄灯闪烁 设备自动化整合系统软件开发方案
0