首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >脚本引擎的ExecutorService线程间隔

脚本引擎的ExecutorService线程间隔
EN

Stack Overflow用户
提问于 2012-06-12 03:18:07
回答 1查看 235关注 0票数 0

以下是从zip文件加密条目并将其存储为文件的java方法。文件的读写没有问题,所以与第2-5行没有任何关系。问题如下所述..。

ExecutorService对象(es)用于从ZipEntry[]数组(ze) 1获得Zip条目,并通过一定数量的线程并发执行它们。每个线程都使用来自ScriptEngine数组(se)的一个ScriptEngine对象来实现。当一个线程完成它的执行时,脚本引擎将为另一个条目释放。问题是对于第一批线程资源(条目),执行器不均匀地分配条目。因此,有多个条目被发送到单个引擎,从而导致死锁。

  1. 如何延迟线程在前一个线程之后运行几毫秒?

  1. 如何在脚本引擎繁忙时对资源进行排队。但我找不到解决办法:

下面是代码:

代码语言:javascript
复制
static void encryptzip(ScriptEngine[] sc, String u, String k, ExecutorService es) throws... {
    ZipFile zf = new ZipFile(u);
    ZipEntry[] ze = getEntries(zf);
    byte[][] zb = getArrayOfEntryBytes(zf, ze);
    String p = getExtractionPath(u);
    for(int i=0;i<ze.length;i++){
        encentry ee = new encentry();
        ee.bytes = zb[i];
        ee.entry = ze[i];
        ee.key = k;
        ee.path = p;
        ee.script = getFreeScriptEngine(sc);
        es.execute(ee);
    }
}
EN

回答 1

Stack Overflow用户

发布于 2012-06-14 18:17:42

无论getFreeScriptEngine()正在做什么,回答这个问题都是很重要的。

如果我不正确,您需要依次执行加密算法到免费脚本引擎。这是并行性的主要来源。因此,您需要在阻塞队列中调度加密任务,阻塞队列中的锁(或监视器,如java监视器模式中的锁)与您需要持有的锁相同,以便正确确定并发、多线程运行时中的“空闲引擎”(非常简单地将监视器放在"isEngineFree“布尔变量上,而该变量可能是"engine”实例容纳的吗?)一旦您确定了正确的锁,您就可以让一个singleThreadedExecutor依次执行任务到“空闲”引擎。这可以通过将包含加密任务的“空闲引擎”-blocked队列分发给singleThreadedExecutor服务来实现。

实际上,有更复杂的锁定机制,可以让您对所有任务使用相同的阻塞队列,同时仍然保持每个任务都有一个无任务引擎执行策略。实践中的Java并发高级部分是一本值得一看的好书,它可以为您提供一些关于这方面的指导。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10990133

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档