这是一种是用很多的设计模式, 其核心思想就是服务线程开始就准备好,不断查看是否有新的请求,如果有新的请求,就处理。但事实上,服务端的处理能力很有可能有限,但是作为程序的健壮性,不可能丢掉任何一个客户端请求,这种一个比较好的方案就是对客户端的请求进行排队,放到队列里面,然后服务线程一个一个处理。这样至少能避免服务端处理太多请求而崩溃。

如下例子假设:程序一开始就开启10个服务线程,一直处于等待状态,查看队列中是否有新的请求,如果有就处理。 当服务线程准备好之后,客户端就可以发出请求,这里模拟了10个客户线程,每一个客户线程发起10次请求,中间间隔10毫秒。假设每个服务进程处理一个请求需要100毫秒。明显时间比较长,没办法及时处理客户端请求. 一下代码就是这种模式的核心代码:

服务端线程package com.yihaomen.gs;

public class ServerThread extends Thread {

private RequestQueue requestQueue;

public ServerThread(RequestQueue requestQueue, String name) {

super(name);

this.requestQueue = requestQueue;

}

public void run() {

// 线程一直存在,直到进程结束. 守护线程。

while (true) {

final Request request = requestQueue.getRequest();

try {

Thread.sleep(100);

} catch (InterruptedException e) {

e.printStackTrace();

}

System.out.println(Thread.currentThread().getName() + " handles " + request);

}

}

}

客户线程

package com.yihaomen.gs;

public class ClientThread extends Thread {

private RequestQueue requestQueue;

public ClientThread(RequestQueue requestQueue, String name) {

super(name);

this.requestQueue = requestQueue;

}

public void run() {

for (int i = 0; i < 10; i++) {

Request request = new Request("RequestID:" + i+" Thread_Name:"+Thread.currentThread().getName());

System.out.println(Thread.currentThread().getName() + " requests " + request);

requestQueue.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");

}

}

模拟测试

package com.yihaomen.gs;

public class Main {

public static void main(String[] args) {

RequestQueue requestQueue = new RequestQueue();

for(int i=0;i<10;i++) {

new ServerThread(requestQueue, "ServerThread"+i).start();

}

for(int i=0;i<10;i++){

new ClientThread(requestQueue, "ClientThread"+i).start();

}

}

}

当客户端请求处理完之后, 10个服务线程仍然在继续工作,继续等待新的请求,这种模式保证了客户端请求不会丢失,同时服务线程也不会承受大量并发的请求从而导致计算机资源的不足.

测试代码下载:

java thread guarded suspension pattern sample code

java guardedby_java 多线程并发设计模式之三:Guarded suspension 模式相关推荐

  1. 并发设计模式之Guarded Suspension模式

    - 原文链接: http://www.joyhwong.com/2016/11/19/并发设计模式之guarded-suspension模式/ Guarded Suspension意为保护暂停,其核心 ...

  2. Java并发编程实战~Guarded Suspension模式

    Guarded Suspension 模式 比如,项目组团建要外出聚餐,我们提前预订了一个包间,然后兴冲冲地奔过去,到那儿后大堂经理看了一眼包间,发现服务员正在收拾,就会告诉我们:"您预订的 ...

  3. java消费者生产者设计模式_java 多线程并发设计模式之四: 生产者消费者模式

    生产者消费者模式是一个经典的多线程设计模式,其核心思想是:有两类线程和一个内存缓冲区或者队列, 一类线程发起任务,并提交到队列中.另一类线程用来处理这些任务,叫做消费者线程. 这两类线程进行通信的桥梁 ...

  4. 实战并发编程 - 08基于Guarded Suspension模式优化轮询while(true)

    文章目录 Guarded Suspension模式简介 看牙医的就诊流程 代码举例 总结与拓展 Guarded Suspension模式简介 guarded在这里是"保护"的意思: ...

  5. Java接口多线程并发测试 (一)

    本文为作者原创,禁止转载,违者必究法律责任!!! 本文为作者原创,禁止转载,违者必究法律责任!!! Java接口多线程并发测试 一,首先写一个接口post 请求代码: import org.apach ...

  6. 并发设计模式之生产者-消费者模式

    点击查看原文: http://www.joyhwong.com/2016/11/19/并发设计模式之生产者-消费者模式/ 生产者-消费者模式是一个经典的多线程设计模式,它为多线程间的协作提供了良好的解 ...

  7. java sqlite 多线程并发_C#_C#解决SQlite并发异常问题的方法(使用读写锁),本文实例讲述了C#解决SQlite并 - phpStudy...

    C#解决SQlite并发异常问题的方法(使用读写锁) 本文实例讲述了C#解决SQlite并发异常问题的方法.分享给大家供大家参考,具体如下: 使用C#访问sqlite时,常会遇到多线程并发导致SQLI ...

  8. java sqlite 多线程并发_sqlite之多线程总结

    12.android 多线程数据库读写分析与优化 11.多线程操作Sqlite? ==== 最新需要给软件做数据库读写方面的优化,之前无论读写,都是用一个 SQLiteOpenHelper.getWr ...

  9. Java 模拟多线程并发案例

    一.使用 CountDownLatch 模拟多线程并发(并行) CountDownLatch 介绍: countDownLatch是在java1.5被引入,跟它一起被引入的工具类还有CyclicBar ...

  10. java 模拟多线程并发_Java中模拟同时并发请求

    有时需要测试一下某个功能的并发性能,又不要想借助于其他工具,索性就自己的开发语言,来一个并发请求就最方便了. java中模拟并发请求,自然是很方便的,只要多开几个线程,发起请求就好了.但是,这种请求, ...

最新文章

  1. Elasticsearch增删改查
  2. jawstats php,JAWStats 配置(为AWStats配上华丽的外衣)
  3. nagios插件--磁盘IO监控
  4. postgresql 删除触发器_PostgreSQL:我没有带闪,不讲武德
  5. Google play billing(Google play 内支付)
  6. linux中xjvf指令,linux解压缩命令小结
  7. python pandas csv读取_如何用 pandas 读取 csv 和 Excel 数据
  8. Java -- IO
  9. 130号:SpringBoot使用AOP
  10. TCP UDP 套接字
  11. ubunt之一些问题解决办法
  12. arduino 写字机器人制作教程
  13. el-cascader数据绑定值原理之展平操作的算法
  14. ODM操作MongoDB
  15. 警告:integer division in floating-point context
  16. 付呗聚合支付快速教程——导读
  17. 在家访问办公室电脑能实现吗?远程控制办公室电脑的软件推荐
  18. 与省市级联的市县——根据省/直辖市显示对应的市县
  19. Dell PowerEdge T140服务器安装系统笔记
  20. LeetCode刷题:871. Minimum Number of Refueling Stops

热门文章

  1. Ubuntu上无法登录网页版本微信的解决方案
  2. Pyramidal Convolution: Rethinking Convolutional Neural Networks for Visual Recognition论文阅读翻译
  3. pygame:超级玛丽
  4. 集成calibre到cadence virtuoso环境中 load: can‘t access file - “/opt/eda/Mentor/lib/calibre.skl“
  5. ecshop模板修改大全
  6. 10个提升写作手法的方法
  7. 西门子plc200 c语言转换,西门子S7-200 系列PLC量程转换及编程方法
  8. python上台阶问题_“上台阶问题”的分析
  9. 百度大脑人脸离线识别SDK Windows版
  10. 穆利堂推荐机会来了你做好准备了吗?怎么让机会找到你?