0

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

ExecutorService对象(es)用于从ZipEntry[]数组(ze)1by1中获取Zip Entry,并由固定数量的线程同时执行它们。每个线程都使用ScriptEngineScriptEngine 数组 (se) 中的一个对象来实现。当一个线程完成其执行时,脚本引擎将为另一个条目腾出空间。问题是对于第一批线程资源(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);
    }
}
4

1 回答 1

0

不管它在getFreeScriptEngine() 做什么,回答这个问题很重要。

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

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

于 2012-06-14T18:17:42.677 回答