多线程设计模式之Guarded Suspension模式

原创 2015年07月07日 19:46:33

Guarded Suspension意为保护暂停,就是说把客户端的请求排队,由服务器程序一个一个处理。
当客户端的请求数量超过了服务线程的处理能力,在频繁的客户端请求中,RequestQueue充当了中间缓存,存放未处理的请求,保证了客户请求不丢失,同时也保护了服务线程不会受到大量并发的请求,而导致计算机资源不足。

给出一个简单实现。

1、请求类Request

package javacurrent.guardedsuspension;

public class Request {
    private String name;
    public Request(String name){
        this.name = name;
    }

    public String getName(){
        return name;
    }

    public String toString(){
        return "[Request" + name + "]";
    }
}

2、Request的集合类RequestQueue

package javacurrent.guardedsuspension;

import java.util.LinkedList;

public class RequestQueue {
    private java.util.LinkedList queue = new LinkedList();
    public synchronized Request getRequest(){
        while(queue.size() == 0){
            try {
                wait();
            } catch (InterruptedException e) {
            }
        }
        return (Request)queue.remove();
    }
    public synchronized void addRequest(Request request){
        queue.add(request);
        notifyAll();
    }
}

3、服务端进程,用于处理客户端请求。

package javacurrent.guardedsuspension;

public class ServerThread extends Thread {
    private RequestQueue queue;

    public ServerThread(RequestQueue queue, String name){
        super(name);
        this.queue = queue;
    }

    public void run() {
        while (true) {
            final Request request = queue.getRequest();
            try {
                Thread.sleep(100);
            } catch (InterruptedException e) {
            }
            System.out.println(Thread.currentThread().getName() + " handles " + request);
        }
    }
}

4、客户端进程,用于给服务端发起请求

package javacurrent.guardedsuspension;

public class ClientThread extends Thread {
    private RequestQueue queue;

    public ClientThread(RequestQueue queue, String name) {
        super(name);
        this.queue = queue;
    }

    public void run() {
        for (int i = 0; i < 10; i++) {
            Request request = new Request("RequestID:" + i + " Thread_Name:"
                    + Thread.currentThread().getName());
            queue.addRequest(request);
            try {
                Thread.sleep(10);
            } catch (InterruptedException e) {
            }
            System.out.println("ClientThread Name is:" + Thread.currentThread().getName());
        }
        System.out.println(Thread.currentThread().getName() + " request end");
    }
}

5、Main类,开启了10个Client进程和Server进程,Client进程的请求速度快于Server进程的处理请求速度,于是RequestQueue发挥了中间缓存的作用。

package javacurrent.guardedsuspension;

public class Main {
    public static void main(String[] args) {
        RequestQueue queue = new RequestQueue();
        for (int i = 0; i < 10; i++) {
            new ClientThread(queue, "ClientThread " + i).start();
        }
        for (int i = 0; i < 10; i++) {
            new ServerThread(queue, "ServerThread " + i).start();
        }
    }
}

6、测试结果
ClientThread Name is:ClientThread 6
ClientThread Name is:ClientThread 2
ClientThread Name is:ClientThread 0
ClientThread Name is:ClientThread 1
ClientThread Name is:ClientThread 4
ClientThread Name is:ClientThread 2
ClientThread Name is:ClientThread 6
ClientThread Name is:ClientThread 7
ClientThread Name is:ClientThread 3
ServerThread 1 handles [RequestRequestID:0 Thread_Name:ClientThread 0]
ServerThread 5 handles [RequestRequestID:0 Thread_Name:ClientThread 6]
ServerThread 9 handles [RequestRequestID:0 Thread_Name:ClientThread 9]
ServerThread 8 handles [RequestRequestID:0 Thread_Name:ClientThread 8]
ServerThread 0 handles [RequestRequestID:0 Thread_Name:ClientThread 2]
ServerThread 4 handles [RequestRequestID:0 Thread_Name:ClientThread 5]
ClientThread Name is:ClientThread 8
ClientThread Name is:ClientThread 9
ClientThread Name is:ClientThread 5
ServerThread 6 handles [RequestRequestID:0 Thread_Name:ClientThread 3]
ServerThread 2 handles [RequestRequestID:0 Thread_Name:ClientThread 4]
ServerThread 3 handles [RequestRequestID:0 Thread_Name:ClientThread 1]
ServerThread 7 handles [RequestRequestID:0 Thread_Name:ClientThread 7]
ClientThread Name is:ClientThread 4
ClientThread Name is:ClientThread 8
。。。。。。。
。。。。。。
。。。。。。
ClientThread 5 request end
ClientThread Name is:ClientThread 1
ClientThread 1 request end
ClientThread Name is:ClientThread 0
ClientThread 0 request end
ClientThread Name is:ClientThread 4
ClientThread 4 request end
ClientThread Name is:ClientThread 3
ClientThread 3 request end
ClientThread Name is:ClientThread 2
ClientThread 2 request end
ClientThread 6 request end
ServerThread 1 handles [RequestRequestID:1 Thread_Name:ClientThread 3]
ServerThread 5 handles [RequestRequestID:1 Thread_Name:ClientThread 8]
ServerThread 9 handles [RequestRequestID:1 Thread_Name:ClientThread 7]
ServerThread 8 handles [RequestRequestID:1 Thread_Name:ClientThread 9]
ServerThread 0 handles [RequestRequestID:1 Thread_Name:ClientThread 6]
ServerThread 4 handles [RequestRequestID:1 Thread_Name:ClientThread 4]
ServerThread 6 handles [RequestRequestID:1 Thread_Name:ClientThread 5]
ServerThread 2 handles [RequestRequestID:1 Thread_Name:ClientThread 2]

可见最后客户端都退出了,由于请求未处理完,服务端继续处理请求,直到请求全部处理为止。

《java多线程设计模式 第三章Guarded Suspension Pattern》

public class Request { private final String name; public Request(String name) { this.name = ...

java多线程设计模式之Guarded Suspension

想象一个场景,你在排队领军训的装备,当你排队到窗口的时候,工作人员对你说,等一下,让我叫后勤先去仓库取下装备再给你,于是你等到工作人员取回装备才能领走装备。 抽象为一个java程序模型:你是一个线程C...

多线程设计模式——Guarded Suspension(保护性暂挂模式)

这些都是根据我最近看的《Java实战指南多线程编程(设计模式篇)》所得整理。模式名称Guarded Suspension(保护性暂挂模式)模式面对的问题多线程编程中,往往将一个任务分解为不同的部分,将...
  • buyoufa
  • buyoufa
  • 2016年07月06日 15:07
  • 879

由迅雷笔试题想到的——Guarded Suspension Pattern设计模式

由迅雷笔试题想到的——Guarded Suspension Pattern设计模式 分类: 多线程相关2010-12-13 19:30 393人阅读 评论(0) 收藏 举报 设计模...

Guarded Suspension设计模式

1 要解决的问题     Guarded Suspension(保护暂停),其核心思想是:仅当服务端进程准备好后,才提供服务。假设一种场景,服务器可能会在短时间内接收到大量的客户端请求,可能已经超过...

Java程序性能优化 读书笔记(十二)并行设计模式:Guarded Suspension模式

转载: 一、Guarded Suspension模式 Guarded Suspension意为保护暂停,其核心思想是仅当服务进程准备好时,才提供服务。设想一种场景,服务器可能会在很短时间内承受大量的客...

并发设计模式之Guarded Suspension模式

- 原文链接: http://www.joyhwong.com/2016/11/19/并发设计模式之guarded-suspension模式/ Guarded Suspension意为保护暂停,...
  • liuchuo
  • liuchuo
  • 2016年11月25日 14:14
  • 361

Java 并行程序设计模式 (Guarded Suspension模式)

并行设计模式属于设计优化的一部分,它是对一些常用的多线程结构的总结和抽象。与串行程序相比,并行程序的结构通常更为复杂。因此,合理的使用并行模式在多线程开发中,更具有积极意义。并行程序设计模式主要有 F...

Java中的线程(六)- Guarded Suspension 模式

什么是Guarded Suspension 模式

Java多线程设计模式_清晰完整PDF版

  • 2017年11月16日 14:10
  • 37.56MB
  • 下载
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:多线程设计模式之Guarded Suspension模式
举报原因:
原因补充:

(最多只允许输入30个字)