- 浏览: 258767 次
- 性别:
- 来自: 深圳
文章分类
- 全部博客 (88)
- JAVA / base (26)
- JAVA / web (12)
- JAVA / Lib-tools (5)
- SERVER / tomcat (4)
- DB / mysql (4)
- DB / mongodb (2)
- DB / memcached (2)
- DB / redis (2)
- WEB / Front-end (3)
- WEB / security (4)
- WEB / css (2)
- WEB / js (4)
- OS / linux (3)
- IT / Architecture (4)
- IT / other (2)
- Android (9)
- Go (1)
- Other (1)
- OS / Mac (2)
最新评论
-
Zero2Max:
哈哈,马士兵老师也发现了。
java实现接口的bug -
xly1981:
能像CSRF攻击一样带个图就更棒了
XSS跨站攻击 -
xmong:
df274119386 写道在javascript中看到下面的 ...
CSRF攻击与防御策略 -
df274119386:
在javascript中看到下面的语句 e.value = t ...
CSRF攻击与防御策略 -
xmong:
yzxqml 写道xmong 写道yzxqml 写道tomca ...
Tomcat集群
Java实现线程池处理请求:
客户端线程发出请求,请求存入请求队列中,服务器端线程池不断从请求列表中拿出请求,执行请求。服务器端用线程池实现多线程处理请求,线程实例在使用的时候已经被创建,直接使用实例,提供程序的执行效率。
设计如下:
Request:请求类,存储请求信息,携带请求的执行方法。
RequestQueue:存储请求队列类,负责保存请求的存储和取出。
ClientThread:客户端线程类,负责发送请求。
ServerThread:服务端线程类,负责获取请求并执行请求。
ServerThreadPool:服务端线程池类,负责初始化线程数,管理线程。
Main:main类。
实现如下:
Request:请求类
RequestQueue:请求队列类,负责存储请求。
ClientThread:客户端线程类,负责发生请求
ServerThread:服务端线程类,负责获取请求执行请求。
ServerThreadPool:服务端线程池,初始化线程,管理服务线程。
Main:mian类。
执行结果:
客户端线程发出请求,请求存入请求队列中,服务器端线程池不断从请求列表中拿出请求,执行请求。服务器端用线程池实现多线程处理请求,线程实例在使用的时候已经被创建,直接使用实例,提供程序的执行效率。
设计如下:
Request:请求类,存储请求信息,携带请求的执行方法。
RequestQueue:存储请求队列类,负责保存请求的存储和取出。
ClientThread:客户端线程类,负责发送请求。
ServerThread:服务端线程类,负责获取请求并执行请求。
ServerThreadPool:服务端线程池类,负责初始化线程数,管理线程。
Main:main类。
实现如下:
Request:请求类
package com.thread.pool; import java.util.Random; /** * 请求类 * @author Administrator * */ public class Request { /** * 请求名称 */ private final String name; private final Random random = new Random(); public Request(String name){ this.name = name; } public String getName(){ return name; } /** * 请求执行方法 */ public void execute(){ System.out.println(Thread.currentThread().getName()+" execute "+getName()); try { Thread.sleep(random.nextInt(3000));//摸拟执行时间 } catch (InterruptedException e) { e.printStackTrace(); } } public String toString(){ return "{"+name+"}"; } }
RequestQueue:请求队列类,负责存储请求。
package com.thread.pool; import java.util.LinkedList; /** * 请求队列类 * @author Administrator * */ public class RequestQueue { //存储请求列表 private LinkedList<Request> requests = new LinkedList<Request>(); //请求列表大小 private int size; public RequestQueue(int size){ this.size = size; }; /** * 添加请求 * @param request */ public synchronized void putRequest(Request request){ while(requests.size() > size){//判断请求队列中是否达到队列容量 try { System.out.println(Thread.currentThread().getName()+" {putRequest wait}"); wait();//添加线程等待 } catch (InterruptedException e) { e.printStackTrace(); } } requests.addLast(request);//添加请求 System.out.println(Thread.currentThread().getName()+" putRequest "+request); notifyAll();//唤醒其他等待线程 }; /** * 获取请求 * @return */ public synchronized Request getRequest(){ while(requests.size() <= 0){//判断是否队列中是否存在请求 try { System.out.println(Thread.currentThread().getName()+" {getRequest wait}"); wait();//消费线程等待 } catch (InterruptedException e) { e.printStackTrace(); } } Request request = requests.removeFirst();//取出请求 System.out.println(Thread.currentThread().getName()+" getRequest "+request); notifyAll();//唤醒其他线程 return request; }; }
ClientThread:客户端线程类,负责发生请求
package com.thread.pool; import java.util.Random; /** * 客户端线程类 * @author Administrator * */ public class ClientThread extends Thread{ //请求队列 private RequestQueue requestQueue; private Random random = new Random(); public ClientThread(String name, RequestQueue queue){ super(name); this.requestQueue = queue; } /** * 循环产生请求 */ public void run(){ int count = 0; while(true){ Request request = new Request("request."+count+"."+this.getName()); requestQueue.putRequest(request);//添加请求 count++; try { Thread.sleep(random.nextInt(1000));//随机休息 } catch (InterruptedException e) { e.printStackTrace(); } } } }
ServerThread:服务端线程类,负责获取请求执行请求。
package com.thread.pool; /** * 服务端线程类 * @author Administrator * */ public class ServerThread extends Thread{ //请求队列 private RequestQueue requestQueue; public ServerThread(String name, RequestQueue requestQueue){ super(name); this.requestQueue = requestQueue; } /** * 获取请求处理请求 */ public void run (){ while (true) { Request request = requestQueue.getRequest();//获取队列中的请求 request.execute();//执行请求方法 } } }
ServerThreadPool:服务端线程池,初始化线程,管理服务线程。
package com.thread.pool; /** * 服务端线程池 * @author Administrator * */ public class ServerThreadPool { //存储线程数组 private ServerThread[] serverThreads; //请求队列 private RequestQueue requestQueue; /** * 线程池构造方法 * @param queue 队列 * @param size 线程池大小 */ public ServerThreadPool(RequestQueue queue, int size) { this.requestQueue = queue; //初始化线程池 this.serverThreads = new ServerThread[size]; for (int i = 0; i < size; i++) { serverThreads[i] = new ServerThread("ServerThread."+i, requestQueue); } } /** * 循环启动线程池中的线程 */ public void start(){ for (int i = 0; i < serverThreads.length; i++) { serverThreads[i].start(); } } }
Main:mian类。
package com.thread.pool; /** * main类 * @author Administrator * */ public class Main { public static void main(String[] args) { //创建队列 RequestQueue queue = new RequestQueue(3); //创建线程池 ServerThreadPool pool = new ServerThreadPool(queue, 5); //启动客户端线程发送请求 new ClientThread("ClientThread.A", queue).start(); new ClientThread("ClientThread.B", queue).start(); //启动线程池处理请求 pool.start(); } }
执行结果:
ClientThread.A putRequest {request.0.ClientThread.A} ClientThread.B putRequest {request.0.ClientThread.B} ServerThread.1 getRequest {request.0.ClientThread.A} ServerThread.1 execute request.0.ClientThread.A ServerThread.0 getRequest {request.0.ClientThread.B} ServerThread.3 {getRequest wait} ServerThread.0 execute request.0.ClientThread.B ServerThread.2 {getRequest wait} ServerThread.4 {getRequest wait} ServerThread.0 {getRequest wait} ClientThread.A putRequest {request.1.ClientThread.A} ServerThread.0 getRequest {request.1.ClientThread.A} ServerThread.0 execute request.1.ClientThread.A ServerThread.4 {getRequest wait} ServerThread.2 {getRequest wait} ServerThread.3 {getRequest wait} ClientThread.B putRequest {request.1.ClientThread.B} ServerThread.3 getRequest {request.1.ClientThread.B} ServerThread.3 execute request.1.ClientThread.B ServerThread.2 {getRequest wait} ServerThread.4 {getRequest wait} ClientThread.A putRequest {request.2.ClientThread.A} ServerThread.4 getRequest {request.2.ClientThread.A} ServerThread.4 execute request.2.ClientThread.A ServerThread.2 {getRequest wait} ClientThread.B putRequest {request.2.ClientThread.B} ServerThread.2 getRequest {request.2.ClientThread.B} ServerThread.2 execute request.2.ClientThread.B ClientThread.B putRequest {request.3.ClientThread.B} ClientThread.A putRequest {request.3.ClientThread.A} ClientThread.B putRequest {request.4.ClientThread.B} ClientThread.A putRequest {request.4.ClientThread.A} ServerThread.1 getRequest {request.3.ClientThread.B} ServerThread.1 execute request.3.ClientThread.B ServerThread.3 getRequest {request.3.ClientThread.A} ServerThread.3 execute request.3.ClientThread.A ServerThread.4 getRequest {request.4.ClientThread.B} ServerThread.4 execute request.4.ClientThread.B ClientThread.A putRequest {request.5.ClientThread.A} ClientThread.B putRequest {request.5.ClientThread.B} ClientThread.B putRequest {request.6.ClientThread.B} ClientThread.A {putRequest wait} ServerThread.2 getRequest {request.4.ClientThread.A} ServerThread.2 execute request.4.ClientThread.A ClientThread.A putRequest {request.6.ClientThread.A} 。。。。
发表评论
-
Java validation(java验证器实现)
2014-03-18 11:45 3634Java validation 1. java验证器 在 ... -
Memo class备注类信息
2014-03-18 09:52 808Memo Class 1. 什么是Memo Class Mem ... -
java annotation注解
2014-01-24 18:01 9051. Annotation的声明方式 An ... -
Java RMI
2013-03-28 15:12 1645Java Rmi 目录 1 JAVA RMI 1 ... -
java内部类
2013-03-19 16:25 994Java内部类 目录 1 JAVA ... -
java多线程设计模式之订单模式
2013-03-11 14:00 2610Java多线程实现订单模式: 客户端线程向服务端发起请求后, ... -
java多线程设计模式之异步处理请求
2013-03-08 12:36 4484Java实现多线程异步处理请求: Java实现多线程异步处理 ... -
java多线程设计模式之读写文件模式
2013-03-07 17:56 1542Java实现多线程读写数据 ... -
java多线程设计模式之生产者与消费者
2013-03-07 11:34 997Java实现多线程生产者与消费者: 生产者线程负责生产产品 ... -
java多线程设计模式之文件保存
2013-03-06 16:16 1547Java实现多线程保存文件:两线程去保存文件,一个保存线程定时 ... -
java多线程设计模式之队列通信
2013-03-06 13:51 2434Java实现多线程处理队列请求通信:客户端线程向请求队列中不断 ... -
Java读linux系统文件文件名乱码
2012-12-06 17:01 90581,问题描述 web应用想通过Java读取linux系统文件显 ... -
Java安全加密
2012-11-28 10:24 1916安全加密 目录 1 加密安全 1 1.1 应用的安全 1 ... -
图着色问题
2012-11-27 13:05 3059图着色问题 目录 1 图 ... -
JDK6新特性
2012-07-03 23:24 2861JDK6的新特性 JDK6的新特性之一_Desktop类 ... -
JDK7新特性
2012-07-03 15:39 3468JDK7新特性 一 JDK7新特性简介 准备 JDK7下载 ... -
JDK5新特性
2012-07-03 10:23 73JDK5.0新特性 1.自动封箱和自动解封(简单类型和封装类 ... -
java多线程
2012-06-15 15:12 1509Java多线程 目录 1 线 ... -
代理模式
2012-06-13 14:12 1311代理模式 目录 1 代理 ... -
java垃圾回收机制
2012-06-11 11:30 2527Java内存回收 目录 1 JAVA内存STACK和HE ...
相关推荐
十二、 多线程★★★★ 39 为什么要使用多线程 39 创建线程和启动 39 线程的生命周期 44 线程管理 45 线程同步 49 线程通信 52 线程池 58 死锁 64 线程相关类 65 十三、 同步★★★★★ 67 十四、 Lock接口 70 十五...
│ │ 9.JAVA并发编程之多线程并发同步业务场景与解决方案.wmv │ │ │ ├─10.微服务架构之Spring Cloud Eureka 场景分析与实战 │ │ 10.微服务架构之Spring Cloud Eureka 场景分析与实战.wmv │ │ │ ├─11....
Java开发基于多线程和NIO实现聊天室源码+项目说明(含服务端+客户端).zip 涉及到的技术点 - 线程池ThreadPoolExecutor - 阻塞队列BlockingQueue,生产者消费者模式 - Selector - Channel - ByteBuffer - ...
【多线程】Java四种线程池的创建方法 83 【多线程】线程池原理和运行机制 83 【多线程】线程池对任务的处理 85 【多线程】线程池的状态 86 线程池的状态说明 86 各个状态之间的转换 86 【多线程】什么是线程池?如果...
(1)如果设计正确,多线程程序可以通过提高处理器资源的利用率来提升系统吞吐率 (2)建模简单:通过使用线程可以讲复杂并且异步的工作流进一步分解成一组简单并且同步的工作流,每个工作流在一个单独的线程...
面试题包括以下十九部分:Java 基础、容器、多线程、反射、对象拷贝、Java Web 模块、异常、网络、设计模式、Spring/Spring MVC、Spring Boot/Spring Cloud、Hibernate、Mybatis、RabbitMQ、Kafka、Zookeeper、MySql...
谈谈java多线程 23.谈谈文件加密技术 24.软件开发生命周期 25.路由协议种类及特点 26.java的awt和swing组件的GUI设计的关键 27.对于java流的认识 28.简单描述一下awt与swing区别。 29.简述java编程中事件处理...
8.3 面向对象的设计模式 241 实例156 Singleton单例模式 242 实例157 招聘(简单工厂模式) 243 实例158 同学聚会(工厂方法模式) 244 实例159 图书展(抽象工厂模式) 246 实例160 汽车...
8.3 面向对象的设计模式 241 实例156 Singleton单例模式 242 实例157 招聘(简单工厂模式) 243 实例158 同学聚会(工厂方法模式) 244 实例159 图书展(抽象工厂模式) 246 实例160 汽车适配器(Adapter适配器模式...
8.3 面向对象的设计模式 241 实例156 Singleton单例模式 242 实例157 招聘(简单工厂模式) 243 实例158 同学聚会(工厂方法模式) 244 实例159 图书展(抽象工厂模式) 246 实例160 汽车适配器...
jwx是开源的java公众号开发MVC框架,基于spring配置文件和微信消息或事件注解,通过微信上下文处理一个或多个微信公众号服务请求。目的主要有两个,其一生封装微信请求xml消息为java实体对象,将返回对象转换为xml...
三、多线程 13 35. 并行和并发有什么区别? 13 36. 线程和进程的区别? 14 37. 守护线程是什么? 14 38. 创建线程有哪几种方式? 14 39. 说一下 runnable 和 callable 有什么区别? 15 40. 线程有哪些状态? 15 41. ...
8.3 面向对象的设计模式 241 实例156 Singleton单例模式 242 实例157 招聘(简单工厂模式) 243 实例158 同学聚会(工厂方法模式) 244 实例159 图书展(抽象工厂模式) 246 实例160 汽车适配器(Adapter适配器模式...
8.3 面向对象的设计模式 241 实例156 Singleton单例模式 242 实例157 招聘(简单工厂模式) 243 实例158 同学聚会(工厂方法模式) 244 实例159 图书展(抽象工厂模式) 246 实例160 汽车适配器(Adapter...
实例143 使用线程池优化多线程编程 186 实例144 Object类中线程相关的方法 187 实例145 哲学家就餐问题 189 实例146 使用信号量实现线程同步 190 实例147 使用原子变量实现线程同步 191 实例148 使用事件分配线程...
|--多线程之线程池ExecutorService |--字体为粗体 |--安卓下的多线程断点上传 |--对话框与进度条结合用法 |--屏幕之Activity全屏 |--屏幕之横竖屏切换 |--屏幕之调节屏幕亮度 |--屏幕相关之Display类获取屏幕尺寸和...
两个线程池,一个包含基于在实验期间模拟的最大客户端/用户数量的专用加载线程和一个(可能更小)用于模拟异步操作执行的共享线程池 请求生成与请求执行分离如果需要或可行,此设计选择允许 Rain 生成可由合适的第三...