以下是从zip文件加密条目并将其存储为文件的java方法。文件的读写没有问题,所以与第2-5行没有任何关系。问题如下所述..。
ExecutorService对象(es)用于从ZipEntry[]数组(ze) 1获得Zip条目,并通过一定数量的线程并发执行它们。每个线程都使用来自ScriptEngine数组(se)的一个ScriptEngine对象来实现。当一个线程完成它的执行时,脚本引擎将为另一个条目释放。问题是对于第一批线程资源(条目),执行器不均匀地分配条目。因此,有多个条目被发送到单个引擎,从而导致死锁。
或
下面是代码:
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);
}
}发布于 2012-06-14 18:17:42
无论getFreeScriptEngine()正在做什么,回答这个问题都是很重要的。
如果我不正确,您需要依次执行加密算法到免费脚本引擎。这是并行性的主要来源。因此,您需要在阻塞队列中调度加密任务,阻塞队列中的锁(或监视器,如java监视器模式中的锁)与您需要持有的锁相同,以便正确确定并发、多线程运行时中的“空闲引擎”(非常简单地将监视器放在"isEngineFree“布尔变量上,而该变量可能是"engine”实例容纳的吗?)一旦您确定了正确的锁,您就可以让一个singleThreadedExecutor依次执行任务到“空闲”引擎。这可以通过将包含加密任务的“空闲引擎”-blocked队列分发给singleThreadedExecutor服务来实现。
实际上,有更复杂的锁定机制,可以让您对所有任务使用相同的阻塞队列,同时仍然保持每个任务都有一个无任务引擎执行策略。实践中的Java并发高级部分是一本值得一看的好书,它可以为您提供一些关于这方面的指导。
https://stackoverflow.com/questions/10990133
复制相似问题