package tutorial.pattern;
import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;
import java.net.UnknownHostException;
import java.util.ArrayList;
import java.util.concurrent.ArrayBlockingQueue;
public class ReactorPattern {
DemultiPlexer demultiPlexer = new DemultiPlexer();
public static void main(String args[]) throws InterruptedException, IOException {
ReactorPattern reactorPattern = new ReactorPattern();
ServerSocket server = new ServerSocket(1220);
Runtime.getRuntime().addShutdownHook(new ShutdownHookThread(server));
long s = System.currentTimeMillis();
for (;;) {
if (System.currentTimeMillis() - s > 30000)
break;
Socket socket = server.accept();
int i = socket.getInputStream().read();
if (i != -1) {
reactorPattern.getDemultiPlexer().accept(i);
}
}
server.close();
}
public DemultiPlexer getDemultiPlexer() {
return demultiPlexer;
}
}
class Dispatcher {
private Integer requestId;
private Integer resourceId;
private DemultiPlexer demultiPlexer;
public Dispatcher(DemultiPlexer demultiPlexer, Integer requestId, Integer resourceId) {
super();
this.requestId = requestId;
this.resourceId = resourceId;
this.demultiPlexer = demultiPlexer;
}
/**
* create a request handler when demultiPlexer has an ideal resource.
*
* @return RequestHandler
*/
public RequestHandler createRequestHandler() {
return new RequestHandler(this, requestId, resourceId);
}
/**
* when request handler complete task, free the resource assigned.
*/
public synchronized void freeResource(Integer i) {
demultiPlexer.returnResource(i);
}
public Integer getRequestId() {
return requestId;
}
public void setRequestId(Integer requestId) {
this.requestId = requestId;
}
public Integer getResourceId() {
return resourceId;
}
public void setResourceId(Integer resourceId) {
this.resourceId = resourceId;
}
public DemultiPlexer getDemultiPlexer() {
return demultiPlexer;
}
public void setDemultiPlexer(DemultiPlexer demultiPlexer) {
this.demultiPlexer = demultiPlexer;
}
}
class RequestHandler extends Thread {
private Integer tid;
private Integer rid;
private Dispatcher dispatcher;
public RequestHandler(Dispatcher dispatcher, Integer tid, Integer rid) {
this.tid = tid;
this.rid = rid;
this.dispatcher = dispatcher;
}
@Override
public void run() {
System.out.println("the request No.[" + tid + "] is handling the requesting with resource [" + rid + "]");
try {
sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("the request No.[" + tid + "] processed the requesting with resource [" + rid + "]");
// free resource after request was handled
dispatcher.freeResource(rid);
System.out.println("return resource: " + rid);
}
}
class DemultiPlexer {
private ArrayBlockingQueue<Integer> resources = new ArrayBlockingQueue<Integer>(2);
{
resources.add(1);
resources.add(2);
}
private ArrayList<Integer> requests = new ArrayList<Integer>(5);
/**
*
* @param s
* the starting time of get resource action
* @param timeout
* , limit the request resource action within a time period in
* second
* @return a integer represent a resource requesting
*/
public synchronized Integer getResource(long s, int timeout) {
for (;;) {
if ((System.currentTimeMillis() - s) / 1000 > timeout) {
throw new RuntimeException("time out to get resource");
} else if (resources.size() > 0) {
return resources.poll();
}
try {
Thread.sleep(500);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
public void returnResource(Integer i) {
synchronized (resources) {
resources.add(i);
}
}
/**
* accept a request and create a new dispatcher to assign the resource to a
* request handler.
*
* @param Request
*/
public void accept(Integer requestId) {
requests.add(requestId);
Integer rid = getResource(System.currentTimeMillis(), 5);
Dispatcher d = new Dispatcher(this, requestId, rid);
d.createRequestHandler().start();
}
}
class Requester extends Thread {
private String address = "localhost";
private int port = 1220;
private int requestID;
@Override
public void run() {
try {
Socket socket = new Socket(address, port);
socket.getOutputStream().write(requestID);
sleep(5000);
socket.close();
} catch (UnknownHostException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("No." + requestID + " was sent...");
}
public static void main(String args[]) {
for (int i=0; i< 10 ; i++){
new Requester(i).start();
}
}
public void setRequestID(int requestID) {
this.requestID = requestID;
}
public Requester(int requestID) {
this.requestID = requestID;
}
public int getRequestID() {
return requestID;
}
}
class ShutdownHookThread extends Thread {
private ServerSocket server;
public ShutdownHookThread(ServerSocket server) {
this.server = server;
}
@Override
public void run() {
try {
server.close();
} catch (IOException e) {
e.printStackTrace();
} finally {
server = null;
}
}
}
分享到:
相关推荐
`epoll`反应堆则是基于`epoll`实现的一种设计模式,用于构建高性能、可扩展的服务架构。 `epoll`的核心特点包括: 1. **边缘触发(Edge-Triggered)与水平触发(Level-Triggered)**:`epoll`支持两种触发模式。...
在IT行业中,网络编程是构建分布式系统的基础,而C/S(Client/Server)反应堆模型则是其中一种常用的设计模式。本文将深入探讨“C/S反应堆模型”在socket网络编程中的应用,以及如何使用C++语言实现这一模型。 首先...
在本项目中,"钢铁侠xiong前反应堆.zip"是一个包含HTML和CSS代码的压缩包,用于创建一个模拟钢铁侠胸前反应堆的网页元素。这个项目展示了如何利用前端技术来实现一个具有视觉吸引力的交互式设计。下面将详细讨论HTML...
在压水堆中,联锁设计主要是为了在正常运行模式下避免不必要的保护停堆,从而阻碍反应堆转换至其他运行状态。联锁功能的逻辑设计是提升系统可靠性的关键,通过合理的逻辑结构可以避免误触发,保证系统在关键时刻能够...
本文研究了反应堆在不同形状下,释热率随温度变化进行数值计算的过程,并对所得结果进行了精确性和可靠性的验证。在此过程中,使用了有限容积方法,并结合非结构化网格,模拟了无限大平板型、圆柱型和球体型反应堆内...
标题所指的知识点为“epoll反应堆模型”,而描述部分重复强调了这一点,即“epoll c++ linux 技术探讨,新手必备”。结合给出的内容片段,可以了解到这是一个关于在Linux环境下使用C++语言实现epoll模型的教程。...
MyWebServer是一个基于Linux的C++轻量级Web服务器,采用epoll(ET模式)作为底层的IO处理方式,模拟Proactor模式的并发模型,支持半同步半反应堆模式,并使用有限状态机思想解析Http报文,主要支持GET请求。...
reactor是一种设计模式, 是服务器的重要模型, 是一种事件驱动的反应堆模式, 高效的事件处理模型。 reactor 反应堆: 事件来了才执行,事件类型可能不尽相同,所以我们需要提前注册好不同的事件处理函数。事件到来就...
反应堆模式是一种常见的事件驱动设计模式,它通过一个事件循环来监控多个事件源。当事件发生时,反应堆会调用相应的回调函数进行处理。在这个服务器中,libevent就是实现反应堆模式的关键组件。 4. **线程池**: ...
临界流现象是反应堆冷却系统设计和运行中的一个关键点,它是指流体在特定条件下达到的最大流量状态,当流量超过临界值时,流动模式会发生显著变化,例如形成汽泡,从而影响系统整体性能。临界流现象的理解和计算对于...
尤其是当反应堆运行在高功率模式时,DNBR值明显高于低功率运行模式。这一结论表明,在高功率下运行核电机组的热稳定性更好,有助于防止由于功率突增导致的偏离泡核沸腾(DNB)现象。 研究还发现,在反应性引入事故...
本压缩包包含了一个关于epoll反应堆的实践代码示例,包括服务器端和客户端的实现,以及Makefile文件,方便编译执行。 1. **epoll简介** - epoll是Event Poll的缩写,主要在Linux 2.5版本之后引入,提供了基于事件...
《核反应堆运行与控制》PPT学习教案涵盖了核反应堆操作的核心方面,旨在教育学习者理解和掌握反应堆的安全运行和控制技术。这份资料详细介绍了反应堆控制的基本任务与原理、功率控制、稳压器控制、蒸汽发生器水位...
前摄模式基于预先调度的回调函数,而反应堆模式则基于事件驱动的回调注册。 5. **设计模式** - 设计模式是解决常见软件设计问题的经验总结,如工厂模式、观察者模式和装饰器模式等。ACE库中的许多组件和机制都基于...
本篇论文主要研究了在不同温度下反应堆释热率的变化,并通过数值计算的方法,探讨了三种不同形状反应堆(无限大平板型、圆柱体型、球体型)的温度场分布情况。文章中提到了非结构化网格与有限容积方法的应用,以及...
在电子技术与核电安全的交叉领域,当反应堆面临无法紧急停堆的情况时,提高核电机组的安全性是一项至关重要的任务。这篇行业资料详细探讨了在这种极端情况下如何通过电子功能来确保核电站的安全运行。 首先,我们要...
- 异步I/O的一种实现方式,区别于反应堆模式。 - 应用程序不直接对I/O请求进行处理,而是提交一个描述了I/O操作的异步操作给操作系统,由操作系统来完成实际的I/O操作,然后通过回调、事件通知或者其它方式通知...
在核电站运行中,反应堆压力容器是至关重要的核心组件之一,它承载着高温高压的核燃料反应,保障核反应的稳定进行。本篇将详细探讨“电子功用-核电站反应堆压力容器保护装置”,主要关注该装置在保护反应堆安全、...
《一种反应堆压力容器IVR条件下结构完整性试验平台》 在核能领域,反应堆压力容器(Pressure Vessel,简称PV)是核电站的核心设备之一,它承担着容纳高温高压核燃料组件及反应堆冷却剂的重要职责。反应堆压力容器在...
论文回顾了反应堆θ13实验的物理学和历史,包括Double Chooz实验及其振荡分析,这反映了反应堆θ13实验领域的发展历程。 7. 开放获取(Open Access) 该论文被标记为开放获取,这意味着公众可以自由地在线获取该...