Интервал между потоками в ExecutorService для скриптового движка
Вот метод Java, чтобы зашифровать запись из zip-файла и сохранить ее как файл. С чтением и записью файлов проблем не возникает, поэтому со строкой 2-5 нет ничего общего. проблема как описано ниже...
ExecutorService
объект (ы), используемый для получения Zip Entry от ZipEntry[]
массив (ze) 1by1 и выполнял их одновременно с фиксированным числом потоков. Каждый поток реализован с ScriptEngine
объект из массива ScriptEngine (se). Когда поток завершит свое выполнение, механизм скриптов будет свободен для другой записи. проблема в том, что для первой партии ресурса потока (записи) исполнитель не делит записи равномерно. Таким образом, существует более одной записи, отправленной на один двигатель, который вызывает тупик
как задержать запуск потока через пару миллисекунд после предыдущего?
ИЛИ ЖЕ
как поставить ресурс в очередь, когда обработчик скриптов занят. но я не вижу решения для этого:
Вот код:
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);
}
}
1 ответ
Что бы это ни было getFreeScriptEngine()
делает важно ответить на это.
Если я правильно понимаю, вам нужно последовательно выполнять алгоритм шифрования для бесплатных скриптовых движков. Это ваш главный источник параллелизма. Таким образом, вам нужно запланировать задачи шифрования в блокирующих очередях, которые блокируются на той же блокировке (или мониторе, что и в шаблоне монитора Java), что и блокировка, которую вам нужно удерживать, чтобы правильно определить "свободный механизм" в параллельной многопоточной, время выполнения (очень просто поместить монитор в логическую переменную isEngineFree, которая, возможно, хранится в экземпляре engine). Как только вы определили правильную блокировку, вы можете иметь singleThreadedExecutor
выполнение задач последовательно с "свободными" движками. Этого вы можете добиться, раздавая очереди с "свободным движком", которые будут содержать задачи шифрования, singleThreadedExecutor
Сервисы.
На самом деле существуют более сложные механизмы блокировки, которые позволили бы вам использовать одну и ту же очередь блокировки для всех задач, сохраняя при этом стратегию выполнения с одной задачей на свободный двигатель. Расширенный раздел Java Concurrency in Practice, который является прекрасной книгой для ознакомления, может дать вам несколько советов по этому поводу.