0

zip ファイルからエントリを暗号化し、ファイルとして保存する Java メソッドを次に示します。ファイルの読み書きは問題ないので、2~5行目は関係ありません。問題は以下のとおりです...

ExecutorServiceオブジェクト (es) を使用して、ZipEntry[]配列 (ze) 1by1 から Zip Entry を取得し、それらを一定数のスレッドで同時に実行しました。各スレッドはScriptEngine、ScriptEngine 配列 (se) からのオブジェクトで実装されます。スレッドが実行を終了すると、スクリプト エンジンは別のエントリのために解放されます。問題は、スレッド リソース (エントリ) の最初のバッチであり、エグゼキュータはエントリを均等に分割しません。そのため、単一のエンジンに複数のエントリが送信され、デッドロックが発生します

  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」ブール変数に配置するだけです。これはおそらく「engine」インスタンスが保持しますか?)。正しいロックを決定したらsingleThreadedExecutor、「フリー」エンジンに順番にタスクを実行させることができます。これは、暗号化タスクを保持する「フリーエンジン」でブロックされたキューをサービスに渡すことで実現できsingleThreadedExecutorます。

実際には、より複雑なロックメカニズムがあり、フリーエンジンごとの単一タスクの実行戦略を維持しながら、すべてのタスクに同じブロッキングキューを使用できます。Java Concurrency in Practiceの高度なセクションは、一見するのに最適な本であり、そのようなことについていくつかの方向性を示すことができます。

于 2012-06-14T18:17:42.677 に答える