2012-06-12 24 views
0

下面是從zip文件加密條目並將其作爲文件存儲的java方法。文件讀寫沒有問題,所以與第2-5行無關。問題如下所述...腳本引擎的ExecutorService線程間隔差距

ExecutorService對象用於從ZipEntry[]數組(ze)1by1獲取Zip條目,並通過固定數量的線程同時執行它們。每個線程都使用ScriptEngine數組(se)中的ScriptEngine對象實現。當一個線程完成其執行時,腳本引擎將爲另一個條目釋放。問題出在第一批線程資源(入口),執行程序不會均勻分配入口。所以有多個條目發送到一個引擎造成死鎖

  1. 如何延遲線程運行幾毫秒後的前一個?

    OR

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

請顯示'getFreeScriptEngine()'的代碼。 –

+0

對不起。這是祕密。你可以嘗試自己 – Dagon

+0

getFreeScriptEngine()如何知道腳本引擎是免費的?獲取腳本引擎是否自動將該腳本引擎標記爲「正在使用」? –

回答

0

不管它是getFreeScriptEngine()做回答這個是很重要的。

如果我不正確,你需要對自由腳本引擎依次執行加密算法。 這是您的並行性的主要來源。 因此,您需要將阻塞隊列中的加密任務安排在同一個鎖(或監視器,如在java監視器模式中)作爲您需要保留的鎖,以便在併發多線程中正確確定「free engine」 ,運行時(非常簡單地把監視器放在「isEngineFree」布爾變量,這可能是一個「引擎」實例?)。 一旦你確定了正確的鎖定,你可以有一個singleThreadedExecutor順序執行任務到「空閒」引擎。您可以通過將「可用引擎」阻塞的隊列(將執行加密任務)分配給singleThreadedExecutor服務來實現此目的。

實際上有更復雜的鎖定機制,可以讓您爲所有任務使用相同的阻塞隊列,同時仍保持單任務每引擎執行策略。 Java Concurrency in Practice的高級部分,這是一本很好的書,可以給你一些關於這方面的指導。

+0

我在實踐中第二個Java Concurrency,請參閱cout down latch。 –