- 浏览: 258455 次
- 性别:
- 来自: 深圳
文章分类
- 全部博客 (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实现多线程处理队列请求通信:客户端线程向请求队列中不断发生请求,服务器端线程不断处理请求队列中请求。
一个线程(ClientThread)对另一线程(ServerThread)传递请求(request)的实例。实现简单的线程沟通。
设计如下:
Request:请求类,存储请求信息的类。
RequestQueue:请求队列类,接受存储请求的队列类。
ClientThread:发送请求的线程类,负责向请求队列中发送请求。
ServerThread:处理请求的线程类,负责向请求队列中取请求处理。
Mian:程序入口
Request:请求类,存储发生信息的类。
Request类中只存放了请求的名字信息。
RequestQueue:请求队列,用例存放请求的队列类。
RequestQueue类用来存放请求的类,这个类拥有putRequest和getRequest两个方法;
putRequest方法是实现将请求(request)存放到请求队列中(requestQueue),客户端线程会调用此方法来发生请求并保持到请求队列中。
getRequest方法是实现将请求(request)从请求队列中(requestQueue)中取出,服务器端线程就会调用此方法将请求队列中的请求取出并处理。
ClientThread:客户端线程,发送请求的线程类。
ServerThread:服务器端线程,处理请求的线程类
Main:main程序执行入口
执行结果:
上面了列子只是一个单线程与单线程通信的列子,如果我们想要看多个线程与多个线程通信,则只需要修改main方法就可以实现:
修改后的执行结果如下:
一个线程(ClientThread)对另一线程(ServerThread)传递请求(request)的实例。实现简单的线程沟通。
设计如下:
Request:请求类,存储请求信息的类。
RequestQueue:请求队列类,接受存储请求的队列类。
ClientThread:发送请求的线程类,负责向请求队列中发送请求。
ServerThread:处理请求的线程类,负责向请求队列中取请求处理。
Mian:程序入口
Request:请求类,存储发生信息的类。
package com.single.queue; /** * * @author Administrator * 请求类 */ public class Request { /** * 请求名称 */ private final String name; public Request(String name){ this.name = name; } public String getName(){ return name; } public String toString(){ return "{Request."+name+"}"; } }
Request类中只存放了请求的名字信息。
RequestQueue:请求队列,用例存放请求的队列类。
package com.single.queue; import java.util.LinkedList; /** * * @author Administrator * 请求队列 */ public class RequestQueue { /** * 请求队列 */ private final LinkedList<Request> queue = new LinkedList<Request>(); /** * 同步取出队列中的请求 * @return */ public synchronized Request getRequest(){ while(queue.size()<=0){ try { System.out.println("{getRequest wait}"); wait(); //如果队列为空,则当前线程进入等待池中 } catch (InterruptedException e) { e.printStackTrace(); } } Request request = queue.removeFirst(); System.out.println(Thread.currentThread().getName()+" getRequest "+request); return request; } /** * 同步向队列中加入请求 * @param request */ public synchronized void putRequest(Request request){ queue.addLast(request); System.out.println(Thread.currentThread().getName()+" putRequest "+request); notifyAll(); //队列中加入请求后,换醒等待线程处理请求 } }
RequestQueue类用来存放请求的类,这个类拥有putRequest和getRequest两个方法;
putRequest方法是实现将请求(request)存放到请求队列中(requestQueue),客户端线程会调用此方法来发生请求并保持到请求队列中。
getRequest方法是实现将请求(request)从请求队列中(requestQueue)中取出,服务器端线程就会调用此方法将请求队列中的请求取出并处理。
ClientThread:客户端线程,发送请求的线程类。
package com.single.queue; import java.util.Random; /** * * @author Administrator * 客户端线程负责发送请求 */ public class ClientThread extends Thread{ /** * 请求队列 */ private RequestQueue requestQueue; /** * client名称 */ private String name; public ClientThread(String name, RequestQueue queue){ super("client."+name); this.name = name; this.requestQueue = queue; } /** * 循环加入多个请求 */ public void run(){ for (int i = 0; i < 10; i++) { Request request = new Request(name+"."+i); requestQueue.putRequest(request); try { Thread.sleep(new Random().nextInt(1010)); } catch (InterruptedException e) { e.printStackTrace(); } } } }
ServerThread:服务器端线程,处理请求的线程类
package com.single.queue; import java.util.Random; /** * * @author Administrator * 服务线程负责处理请求 */ public class ServerThread extends Thread{ /** * 请求队列 */ private RequestQueue requestQueue; public ServerThread(String name,RequestQueue queue){ super("server."+name); this.requestQueue = queue; } /** * 循环取出请求 */ public void run(){ for (int i = 0; i < 10; i++) { requestQueue.getRequest(); try { Thread.sleep(new Random().nextInt(1000)); } catch (InterruptedException e) { e.printStackTrace(); } } } }
Main:main程序执行入口
package com.single.queue; /** * * @author Administrator * main */ public class Main { /** * 客户端线程请求向队列中不断发送请求,服务器端线程不断处理请求。 * @param args */ public static void main(String[] args) { RequestQueue queue = new RequestQueue(); new ClientThread("a",queue).start(); new ServerThread("a",queue).start(); } }
执行结果:
client.a putRequest {Request.a.0} server.a getRequest {Request.a.0} client.a putRequest {Request.a.1} server.a getRequest {Request.a.1} {getRequest wait} client.a putRequest {Request.a.2} server.a getRequest {Request.a.2} client.a putRequest {Request.a.3} server.a getRequest {Request.a.3} {getRequest wait} client.a putRequest {Request.a.4} server.a getRequest {Request.a.4} {getRequest wait} client.a putRequest {Request.a.5} server.a getRequest {Request.a.5} {getRequest wait} client.a putRequest {Request.a.6} server.a getRequest {Request.a.6} client.a putRequest {Request.a.7} client.a putRequest {Request.a.8} server.a getRequest {Request.a.7} server.a getRequest {Request.a.8} {getRequest wait} client.a putRequest {Request.a.9} server.a getRequest {Request.a.9}
上面了列子只是一个单线程与单线程通信的列子,如果我们想要看多个线程与多个线程通信,则只需要修改main方法就可以实现:
public static void main(String[] args) { RequestQueue queue = new RequestQueue(); new ClientThread("a",queue).start(); new ServerThread("a",queue).start(); new ClientThread("b",queue).start(); new ServerThread("b",queue).start(); }
修改后的执行结果如下:
client.a putRequest {Request.a.0} client.b putRequest {Request.b.0} server.a getRequest {Request.a.0} server.b getRequest {Request.b.0} {getRequest wait} client.a putRequest {Request.a.1} server.a getRequest {Request.a.1} client.b putRequest {Request.b.1} server.a getRequest {Request.b.1} {getRequest wait} client.a putRequest {Request.a.2} server.b getRequest {Request.a.2} {getRequest wait} {getRequest wait} client.b putRequest {Request.b.2} server.a getRequest {Request.b.2} {getRequest wait} {getRequest wait} client.b putRequest {Request.b.3} server.a getRequest {Request.b.3} {getRequest wait} {getRequest wait} client.a putRequest {Request.a.3} server.a getRequest {Request.a.3} {getRequest wait} client.a putRequest {Request.a.4} server.b getRequest {Request.a.4} client.b putRequest {Request.b.4} server.b getRequest {Request.b.4} client.a putRequest {Request.a.5} client.a putRequest {Request.a.6} server.a getRequest {Request.a.5} ……
发表评论
-
Java validation(java验证器实现)
2014-03-18 11:45 3627Java validation 1. java验证器 在 ... -
Memo class备注类信息
2014-03-18 09:52 805Memo Class 1. 什么是Memo Class Mem ... -
java annotation注解
2014-01-24 18:01 9011. Annotation的声明方式 An ... -
Java RMI
2013-03-28 15:12 1639Java Rmi 目录 1 JAVA RMI 1 ... -
java内部类
2013-03-19 16:25 992Java内部类 目录 1 JAVA ... -
java多线程设计模式之订单模式
2013-03-11 14:00 2600Java多线程实现订单模式: 客户端线程向服务端发起请求后, ... -
java多线程设计模式之线程池处理请求
2013-03-08 17:50 1779Java实现线程池处理请求: 客户端线程发出请求,请求存入请 ... -
java多线程设计模式之异步处理请求
2013-03-08 12:36 4479Java实现多线程异步处理请求: Java实现多线程异步处理 ... -
java多线程设计模式之读写文件模式
2013-03-07 17:56 1541Java实现多线程读写数据 ... -
java多线程设计模式之生产者与消费者
2013-03-07 11:34 994Java实现多线程生产者与消费者: 生产者线程负责生产产品 ... -
java多线程设计模式之文件保存
2013-03-06 16:16 1545Java实现多线程保存文件:两线程去保存文件,一个保存线程定时 ... -
Java读linux系统文件文件名乱码
2012-12-06 17:01 90521,问题描述 web应用想通过Java读取linux系统文件显 ... -
Java安全加密
2012-11-28 10:24 1914安全加密 目录 1 加密安全 1 1.1 应用的安全 1 ... -
图着色问题
2012-11-27 13:05 3056图着色问题 目录 1 图 ... -
JDK6新特性
2012-07-03 23:24 2858JDK6的新特性 JDK6的新特性之一_Desktop类 ... -
JDK7新特性
2012-07-03 15:39 3466JDK7新特性 一 JDK7新特性简介 准备 JDK7下载 ... -
JDK5新特性
2012-07-03 10:23 73JDK5.0新特性 1.自动封箱和自动解封(简单类型和封装类 ... -
java多线程
2012-06-15 15:12 1508Java多线程 目录 1 线 ... -
代理模式
2012-06-13 14:12 1310代理模式 目录 1 代理 ... -
java垃圾回收机制
2012-06-11 11:30 2525Java内存回收 目录 1 JAVA内存STACK和HE ...
相关推荐
多线程设计,注解方式配置,轻松管理所有消息流 强大的RPC功能,调用远程RPC近似于调用本地函数,无需手工定义内部协议 支持插件功能,轻松实现功能插件 框架基于netty设计,轻松定义外部协议 简单的策划配置管理,...
Java局域网通信——飞鸽传书源代码,大家都知道VB版、VC版还有Delphi版的飞鸽传书软件,但是Java版的确实不多,因此这个Java文件传输实例不可错过,Java网络编程技能的提升很有帮助。 Java聊天程序,包括服务端和...
Java局域网通信——飞鸽传书源代码,大家都知道VB版、VC版还有Delphi版的飞鸽传书软件,但是Java版的确实不多,因此这个Java文件传输实例不可错过,Java网络编程技能的提升很有帮助。 Java聊天程序,包括服务端和...
Java开发基于多线程和NIO实现聊天室源码+项目说明(含服务端+客户端).zip 涉及到的技术点 - 线程池ThreadPoolExecutor - 阻塞队列BlockingQueue,生产者消费者模式 - Selector - Channel - ByteBuffer - ...
了解多线程所带来的安全风险.mp4 从线程的优先级看饥饿问题.mp4 从Java字节码的角度看线程安全性问题.mp4 synchronized保证线程安全的原理(理论层面).mp4 synchronized保证线程安全的原理(jvm层面).mp4 单例问题...
多线程 Java IO 与 NIO Java虚拟机(jvm) 设计模式 :open_file_folder: 数据结构与算法 数据结构 算法 :laptop: 计算机网络与数据通信 网络相关 数据通信(RESTful、RPC、消息队列) :mobile_phone: 操作系统 Linux...
第43节Future设计模式实现(实现类似于JDK提供的Future)00:19:20分钟 | 第44节Future源码解读00:29:22分钟 | 第45节Fork/Join框架详解00:28:09分钟 | 第46节同步容器与并发容器00:18:44分钟 | 第47节并发容器...
实例133 碰撞的球(多线程) 382 实例134 钟表(多线程) 387 实例135 模拟生产者与消费者 392 实例136 仿迅雷下载文件 396 第15章 图形编程 403 实例137 多变的按钮 403 实例138 自制对话框 405 实例139 ...
多线程 IO 问题排查 Web框架、数据库 Spring MySQL Redis 通用基础 操作系统 网络通信协议 排序算法 常用设计模式 从URL到看到网页的过程 分布式 CAP理论 锁 事务 消息队列 协调器 ID生成方式 一致性hash 限流 ...
7 一个支持多线程的服务器框架 13. 8 代理服务器 13. 9 Telnet客户端 13. 10 UDP编程 13. 11 聊天室服务器端 13. 12 聊天室客户端 13. 13 FTP客户端 第14章 数据库 14. 1 连接各种...
第43节Future设计模式实现(实现类似于JDK提供的Future)00:19:20分钟 | 第44节Future源码解读00:29:22分钟 | 第45节Fork/Join框架详解00:28:09分钟 | 第46节同步容器与并发容器00:18:44分钟 | 第47节并发容器...
│ 高并发编程第二阶段41讲、多线程设计模式内容回顾与总结.mp4 │ 高并发编程第二阶段42讲、ClassLoader课程大纲介绍.mp4 │ 高并发编程第二阶段43讲、类加载的过程以及类主动使用的六种情况详细介绍.mp4 │ 高...
│ 高并发编程第二阶段41讲、多线程设计模式内容回顾与总结.mp4 │ 高并发编程第二阶段42讲、ClassLoader课程大纲介绍.mp4 │ 高并发编程第二阶段43讲、类加载的过程以及类主动使用的六种情况详细介绍.mp4 │ 高...
多线程类别知识重构 Netty 总结(---正在进行中---) 数据结构总结重构(---正在进行中---) 说明 JavaGuide介绍 对于 Java 初学者来说: 本文档倾向于给你提供一个比较详细的学习路径,让你对于Java整体的知识体系有一...
8.3 面向对象的设计模式 241 实例156 Singleton单例模式 242 实例157 招聘(简单工厂模式) 243 实例158 同学聚会(工厂方法模式) 244 实例159 图书展(抽象工厂模式) 246 实例160 汽车...
多线程类别知识重构 Netty 总结(---正在进行中---) 数据结构总结重构(---正在进行中---) 说明 JavaGuide介绍 对于 Java 初学者来说: 本文档倾向于给你提供一个比较详细的学习路径,让你对于Java整体的知识体系有一...
多线程 Java IO 与 NIO Java虚拟机(jvm) 设计模式 :open_file_folder: 数据结构与算法 数据结构 算法 :laptop: 计算机网络与数据通信 网络相关 数据通信(RESTful、RPC、消息队列) :mobile_phone: 操作系统 Linux...
8.3 面向对象的设计模式 241 实例156 Singleton单例模式 242 实例157 招聘(简单工厂模式) 243 实例158 同学聚会(工厂方法模式) 244 实例159 图书展(抽象工厂模式) 246 实例160 汽车适配器(Adapter适配器模式...