⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 resourcepool.java

📁 主要考察的是资源池的设计和实现
💻 JAVA
字号:
package ServerImpl;
import java.util.*;

import ServerImpl.*;
import Bank.*;
public abstract class ResourcePool {
    private long expirationTime,leaseTime;
    private long lastCheckOut;
	private ServerLog log;
    protected Hashtable used;
    protected Hashtable unused;
    private Strategy strategy;
    private cleanThread cleaner;
    private releaseThread releaser;
    ResourcePool(){
        expirationTime = ( 1000 * 5); 
        leaseTime=( 300);
        used = new Hashtable();         
        unused = new Hashtable();
        lastCheckOut = System.currentTimeMillis();
        strategy = getStrategy(); 
        log=new ServerLog(ServerConfigure.GetStrategyType(),500);
		cleaner = new cleanThread(this,10000);
        releaser = new releaseThread(this,1000);
        cleaner.start();
        releaser.start();
        this.hashCode();
    }
    abstract Object create(String id)throws Exception;
    abstract void expire(Object o) throws Exception;
    abstract Resource getResourceObject(Object o);
    abstract int getMaxSize();
    abstract Strategy getStrategy();
    
    private int currentSize(){
        return used.size()+unused.size();
    }
    
    public Object findResource(String id) throws UserNotExitsException,Exception{
        Object obj;              
        obj = strategy.getObject(id,this); 
        if(obj!= null){
            unused.remove(obj);
            used.put(obj, getResourceObject(obj));
			log.Record(true);
            return obj;
        }else{
			log.Record(false);
			if(currentSize()==getMaxSize())
				Thread.sleep(2000);
			if(currentSize()<getMaxSize())
			{
				obj = create(id);        
				used.put(obj,getResourceObject(obj));          
			}
			return obj;
		}
    }
    
    public void restoreResource(Object obj){
        if( obj != null )
        {
           Resource rs = (Resource)used.remove(obj);
           if(rs != null){
            rs.setLastusedtime(System.currentTimeMillis());
            unused.put( obj,rs  );
           }
        }
    }
    
    public void clean(){
        Object obj;
        long now = System.currentTimeMillis();
        Enumeration e;
        e = unused.keys();  
        while( e.hasMoreElements() ){
            obj = e.nextElement();        
            if( (now - ((Resource)unused.get(obj)).getLastusedtime()) > expirationTime ){
                unused.remove( obj );
                obj = null;
            }
        }
    }
    public void release(){
        Enumeration e;
        e = used.keys();
        Object obj;
        long now = System.currentTimeMillis();
        while( e.hasMoreElements() ){
            obj = e.nextElement();        
            if((now - ((Resource)used.get(obj)).getLastusedtime()) > leaseTime ){               
                try {
                    restoreResource(obj);
                    expire(obj);                     
                } catch (Exception e1){
                    e1.printStackTrace();
                }
            }
        }
    }
    
    public Hashtable getUsed(){
        return used;
    }
    public Hashtable getUnused(){
        return unused;
    }
}

class cleanThread extends Thread{
    private ResourcePool pool;
    private long sleepTime;
    cleanThread(ResourcePool pool,long sleepTime){
        this.pool = pool;
        this.sleepTime = sleepTime;
    }
    public void run(){
        while(true){
            try{
                sleep(sleepTime);
            }catch( InterruptedException e){
                
            }
            pool.clean();
        }
    }
}

class releaseThread extends Thread{
    private ResourcePool pool;
    private long sleepTime;
    releaseThread(ResourcePool pool,long sleepTime){
        this.pool = pool;
        this.sleepTime = sleepTime;
    }
    public void run(){
        while(true){
            try{
                sleep(sleepTime);
            }catch(InterruptedException e ){
            
            }
            pool.release();
        }
    }
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -