java脚本引擎Groovy并发控制

ScriptEngine是线程安全的,自身没有线程问题,但是变量作用域(Bindings)存在线程问题。一般计算时,如果不考虑线程,都是使用的默认Bindings:

通过源码可以看到,如果不指定Bindings,默认使用内置的Bindings。

这就会导致多线程存在问题,一个线程的变量可能会被另一个线程覆盖掉,导致计算结果出错。所有为了保证不同线程变量作用域相互独立,可以根据线程号来创建Bindings:

    /**
     * 得到当前线程号
     */
    public int getCurrentThread(){
        String threadName = Thread.currentThread().getName().replace("Thread-","");
        return NumberUtil.saveToInteger(threadName,1);
    }
private Map<Integer,Bindings> bindingMap = new HashMap<>(50);

首先定义一个全局map,用来保存线程号和Bindings作用域的映射,可以不用每次计算都去创建新的Bindings,使同一个线程多次计算时,只创建一次Bindings。

    /**
     * 根据线程号返回binding,不存在时创建
     * @param threadNum     线程号
     */
    public Bindings getEngineBinding(int threadNum){
        return bindingMap.computeIfAbsent(threadNum, k -> engine.createBindings());
    }

该线程用完脚本引擎后,必须手动移除Bindings,否则不久就可能导致内存溢出。

一般建议将cleanEngineScope()放在finally语句块中执行,保证异常也一定会执行

    /**
     * 根据线程号清除Binding
     * @param threadNum     线程号
     */
    public void cleanEngineScope(int threadNum){
        bindingMap.remove(threadNum);
    }

完整代码:http://download.csdn.net/download/qq_36635569/12077855

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值