Как синхронизировать отдельные операции чтения/записи общих данных в Java? [закрыто] ⇐ JAVA
Как синхронизировать отдельные операции чтения/записи общих данных в Java? [закрыто]
У меня есть такой код:
публичный класс Test { public static void main(String[] args) выдает ExecutionException, InterruptedException { SharedData SharedData = новые SharedData (); в то время как (истина) { // дорогостоящие вычисления, выполняемые в нескольких потоках, которые // только когда-либо *читает* SharedData Результат результата = runReadOnlyCalculationOnSeveralThreads(sharedData); // основной поток обновляет данные, но в следующий раз это произойдет // чтение должно быть актуальным для всех потоков чтения updateSharedData (sharedData, результат); } } } Существует один метод, который выполняет параллельные операции только для чтения с общим объектом данных. После завершения операций чтения. В первый раз данные обновляются в основном потоке, затем запускаются новые операции чтения и так далее.
Сначала я пытался использовать ExecutorService для параллельных вычислений:
executorService = Executors.newFixedThreadPool(4); Результат runReadOnlyCalculationOnSeveralThreads (SharedData SharedData) { List фьючерсы = новый ArrayList(); for (Param p: параметры) { Futures.add(executorService.submit(() -> вычислить(sharedData, p))); } Итоговый результат = новый Результат(); for (Future f : фьючерс) { итог.add(f.get()); } общая сумма возврата; } Поскольку потоки используются повторно, обновления данных в updateSharedData не будут видны потокам чтения на следующей итерации.
У меня есть такой код:
публичный класс Test { public static void main(String[] args) выдает ExecutionException, InterruptedException { SharedData SharedData = новые SharedData (); в то время как (истина) { // дорогостоящие вычисления, выполняемые в нескольких потоках, которые // только когда-либо *читает* SharedData Результат результата = runReadOnlyCalculationOnSeveralThreads(sharedData); // основной поток обновляет данные, но в следующий раз это произойдет // чтение должно быть актуальным для всех потоков чтения updateSharedData (sharedData, результат); } } } Существует один метод, который выполняет параллельные операции только для чтения с общим объектом данных. После завершения операций чтения. В первый раз данные обновляются в основном потоке, затем запускаются новые операции чтения и так далее.
Сначала я пытался использовать ExecutorService для параллельных вычислений:
executorService = Executors.newFixedThreadPool(4); Результат runReadOnlyCalculationOnSeveralThreads (SharedData SharedData) { List фьючерсы = новый ArrayList(); for (Param p: параметры) { Futures.add(executorService.submit(() -> вычислить(sharedData, p))); } Итоговый результат = новый Результат(); for (Future f : фьючерс) { итог.add(f.get()); } общая сумма возврата; } Поскольку потоки используются повторно, обновления данных в updateSharedData не будут видны потокам чтения на следующей итерации.
-
- Похожие темы
- Ответы
- Просмотры
- Последнее сообщение
-
-
Укажите отдельные ограничения пропуска для чтения, процессора и записи в Spring Batch 2.1.x.
Anonymous » » в форуме JAVA - 0 Ответы
- 29 Просмотры
-
Последнее сообщение Anonymous
-