ScriptEnginePool.java

package us.codecraft.webmagic.scripts;

import javax.script.ScriptEngine;
import javax.script.ScriptEngineManager;

import us.codecraft.webmagic.scripts.languages.Language;

import java.util.concurrent.LinkedBlockingQueue;
import java.util.concurrent.atomic.AtomicInteger;

/**
 * @author code4crafter@gmail.com
 * @since 0.4.1
 */
public class ScriptEnginePool {

    private final AtomicInteger availableCount;

    private final LinkedBlockingQueue<ScriptEngine> scriptEngines = new LinkedBlockingQueue<ScriptEngine>();

    public ScriptEnginePool(Language language,int size) {
        this.availableCount = new AtomicInteger(size);
        for (int i=0;i<size;i++){
            ScriptEngineManager manager = new ScriptEngineManager();
            ScriptEngine engine = manager.getEngineByName(language.getEngineName());
            scriptEngines.add(engine);
        }
    }

    public ScriptEngine getEngine() {
        availableCount.decrementAndGet();
        return scriptEngines.poll();
    }

    public void release(ScriptEngine scriptEngine){
        scriptEngines.add(scriptEngine);
        availableCount.incrementAndGet();
    }

}