【问题标题】:ExecutorService thread interval gap for script-engine脚本引擎的 ExecutorService 线程间隔间隙
【发布时间】:2012-06-12 03:18:07
【问题描述】:

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

ExecutorService 对象 (es) 用于从 ZipEntry[] 数组 (ze) 1by1 获取 Zip 条目,并由固定数量的线程同时执行它们。每个线程都使用来自 ScriptEngine 数组 (se) 的 ScriptEngine 对象实现。当一个线程完成其执行时,脚本引擎将为另一个条目腾出空间。问题是对于第一批线程资源(entry),executor没有平均划分entry。所以有不止一个条目发送到单个引擎导致死锁

  1. 如何将线程运行延迟几毫秒?

  2. 如何在脚本引擎繁忙时对资源进行排队。但我看不到解决方案:

代码如下:

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);
    }
}

【问题讨论】:

  • 请出示getFreeScriptEngine()的代码。
  • 对不起。这是秘密。你可以自己试试
  • getFreeScriptEngine() 如何知道脚本引擎是免费的?获取脚本引擎是否会自动将该脚本引擎标记为“正在使用”?

标签: java multithreading executorservice scriptengine


【解决方案1】:

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

如果我理解正确,您需要对免费脚本引擎按顺序执行加密算法。 这是您并行性的主要来源。 因此,您需要在阻塞队列中安排加密任务,这些任务阻塞在与您需要持有的锁相同的锁(或监视器,如 java 监视器模式中)上,以便正确确定并发、多线程中的“空闲引擎”,运行时(非常简单地将监视器放在“isEngineFree”布尔变量上,可能是“引擎”实例持有?)。 一旦确定了正确的锁,您就可以让singleThreadedExecutor 按顺序执行“空闲”引擎的任务。这可以通过将保存加密任务的“免费引擎”阻塞队列分发给singleThreadedExecutor 服务来实现。

实际上有更复杂的锁定机制,允许您对所有任务使用相同的阻塞队列,同时仍保持单任务每个空闲引擎的执行策略。 Java Concurrency in Practice 的高级部分,这是一本值得一看的好书,可以为您提供一些指导。

【讨论】:

  • 第二次Java并发实践,见cout down latch。
猜你喜欢
  • 2011-09-19
  • 1970-01-01
  • 2011-06-16
  • 2014-08-21
  • 2020-02-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多