/**
* @author jgao1
* 用法:PortfolioManager portfolioManager = PortfolioManager.getInstance();
* portfolioManager.calculateMvoByXMLString(configXml,inputXml,timOut);
*/
public class PortfolioManager {
private static PortfolioManager instance; // 唯一实例
private static int MaxClients = 30;// 最大连接数
private static int clients; // 连接的客户端
/**
* 单例模式建构私有函数以防止其它对象创建本类实例
*/
private PortfolioManager() {
}
/**
* 采用单例模式,返回唯一实例.如果是第一次调用此方法,则创建实例
*
* @return 唯一实例
*/
public static synchronized PortfolioManager getInstance() {
if (instance == null) {
instance = new PortfolioManager();
}
return instance;
}
/**
* 计算MVO
*
* @param configXml
* @param inputXml
* @param timOut:毫秒
* @return
*/
public synchronized String calculateMvoByXMLString(String configXml,
String inputXml, long timOut) {
String outPutXml = null;
clients++;
if (clients <= MaxClients) {
try {
outPutXml = PortfolioUtils.calculateMvoByXMLString(configXml,
inputXml);
freeClient();
} catch (Exception e) {
freeClient();
}
} else {
long startTime = System.currentTimeMillis();
while (!(clients <= MaxClients)) {
try {
wait(timOut);
} catch (InterruptedException e) {
e.printStackTrace();
}
if ((System.currentTimeMillis() - startTime) >= timOut) {
// 记录log日志
return null;// 超时返回为空
}
}
try {
outPutXml = PortfolioUtils.calculateMvoByXMLString(configXml,
inputXml);
freeClient();
} catch (Exception e) {
freeClient();
}
}
return outPutXml;
}
/**
* 同步減少客户端的连接
*/
public synchronized void freeClient() {
clients--;
notifyAll();// 唤醒其他等待的线程
}
}
分享到:
相关推荐
信号量通常用于计数,它可以用来限制对共享资源的访问次数。当一个线程试图访问资源时,如果资源已经被其他线程占用,信号量就会减少相应的计数,表示还有请求等待。当线程完成对资源的访问后,它应该增加信号量的...
Semaphore类限制可同时访问某一资源或资源池的线程数。WaitOne method, which is inherited from the WaitHandle class, and release the semaphore by calling the Release method.”>线程通过调
所谓的”读者—写者问题”是指保证一个Writer进程必须与其他进程互斥地访问共享对象地同步问题.其读写操作限制(包括读者优先和写者优先): 1)写--写互斥,即不能有两个写者同时进行写操作; 2)读--写互斥,即不能...
写者优先的附加限制:如果一个读者申请进行读操作时已有另一写者在等待访问共享资源,则该读者必须等到没有写者处于等待状态后才能开始读操作。 运行结果显示要求:要求在每个线程创建、发出读写操作申请、开始读写...
提示临界区与事件对象(比如互斥对象)的最大的区别是在性能上。临界区在没有线程冲突时,要用10~15个时间片,而事件对象由于涉及到系统内核要用400~600个时间片。 使用互斥的步骤: 1、声明一个类型为Thandle或Hwnd...
Reactor 模型开发效率上比起直接使用 IO 复用要高,它通常是单线程的,设计目标是希望单线程使用一颗 CPU 的全部资源,但也有附带优点,即每个事件处理中很多时候可以不考虑共享资源的互斥访问。可是缺点也是明显的...
写者优先的附加限制:如果一个读者中请进行读操作时已有另一写者在等待访问共享资源,则该读者必须等到没有写者处于等待状态才能开始读操作。 运行结果显示要求:要求在每个线程创建、发出读写操作申请、开始读写...
写者优先的附加限制:如果一个读者申请进行读操作时已有另一写者在等待访问共享资源,则该读者必须等到没有写者处于等待状态后才能开始读操作。 运行结果显示要求:要求在每个线程创建、发出读写操作申请、开始读写...
如果需要对它们进行互斥访问限制,可以使用System.Threading.Interlocked类提供的方法,这个类是提供原子操作的。 3. lock(this)的使用要慎重。共有类型中使用lock(this),如果新的对象被创建并加锁,极易造成死锁。
写者优先的附加限制:如果一个读者申请进行读操作时已有另一个写者在等待访问共享资源,则该读者必须等到没有写者处于等待状态后才能开始读操作。 运行结果显示要求:要求在每个线程创建、发出读写申请、开始读写...
写者优先的附加限制:如果一个读者申请进行读操作时已有另一个写者在等待访问共享资源,则该读者必须等到没有写者处于等待状态后才能开始读操作。 运行结果显示要求:要求在每个线程创建、发出读写申请、开始读写...
写者优先的附加限制:如果一个读者申请进行读操作时已有另一个写者在等待访问共享资源,则该读者必须等到没有写者处于等待状态后才能开始读操作。 运行结果显示要求:要求在每个线程创建、发出读写申请、开始读写...
写者优先的附加限制:如果一个读者申请进行读操作时已有另一个写者在等待访问共享资源,则该读者必须等到没有写者处于等待状态后才能开始读操作。 运行结果显示要求:要求在每个线程创建、发出读写申请、开始读写...
提示临界区与事件对象(比如互斥对象)的最大的区别是在性能上。临界区在没有线程冲突时,要用10~15个时间片,而事件对象由于涉及到系统内核要用400~600个时间片。 使用互斥的步骤: 1、声明一个类型为Thandle或Hwnd...
写者优先的附加限制:如果一个读者申请进行读操作时已有另一写者在等待访问共享资源 则该读者必须等到没有写者处于等待状态后才能开始读操作 运行结果显示要求:要求在每个线程创建 发出读写操作申请 开始读写操作...
但通过“锁”就将资源的访问变成互斥操作,而后与时间有关的错误也不会再产生了。 但,应注意:同一时刻,只能有一个线程持有该锁。 当A线程对某个全局变量加锁访问,B在访问前尝试加锁,拿不到锁,B阻塞。C...
写者优先问题。操作限制:1)写-写互斥;2)读-写互斥;...写者优先的附加限制:如果一个读者申请进行读操作时已有另一写者在等待访问共享资源,则该读者必须等到没有写者处于等待状态后才能开始读操作。
以实时操作系统μC/OS-II为例,分析了产生优先级反转的原因,提出了解决该问题的2种方法,即互斥信号量...在保证共享资源互斥访问的前提下,将优先级反转的发生有效地限制在一个层次上,降解了优先级反转现象的发生。
写者优先的附加限制:如果一个读者申请进行读操作时已有另一写者在等待访问共享资源,则该读者必须等到没有写者处于等待状态后才能开始读操作。 运行结果显示要求:要求在每个线程创建、发出读写操作申请、开始读写...