Java потоки ExecutorService с функциями, которые не поддерживают многопоточность - PullRequest
0 голосов
/ 30 марта 2020

Я пытаюсь использовать многопоточность для довольно тяжелой программы обработки изображений. Многопоточность в основном работает отлично и уменьшает мое время выполнения x4. Однако некоторые внешние библиотеки, которые я использую, не очень стабильны, когда выполняются несколькими потоками, и я иногда получаю ошибки, которые отражают это (например, ошибка пустого изображения, когда на самом деле нет пустых изображений и т. Д. c.)

Я определил две такие функции, которые принадлежат внешней библиотеке (opencv), и я хотел бы изолировать их, если это возможно, чтобы при достижении потоком этой функции он всегда ожидал завершения предыдущего потока sh - таким образом проблемные функции c никогда не будут выполняться более одного раза в данный момент времени.

Может ли это быть достигнуто в Java? Как?

Спасибо

ОБНОВЛЕНИЕ: synchronized Java функция не работает. Иногда (трудно воспроизвести, поэтому это так расстраивает), я вижу ошибку opencv, исходящую из функции, которая отлично работает на 99,9% запусков.

Пример ошибки, которую я недавно получил, и относится к функции opencv fillPoly:

ERROR main.java.com.ibm.staple.Staple  - cv  Exception:  OpenCV(4.0.0) C:\build\master_winpack-bindings-win64-vc14-static\opencv\modules\imgproc\src\drawing.cpp :2403 error: (-215:Assertion failed) p.checkVector(2, CV_32S) >= 0 in function ‘cv::fillPoly’

1 Ответ

0 голосов
/ 30 марта 2020

Вы можете легко добиться этого, используя Синхронизацию в Java. Синхронизация сделает метод доступным только для одного потока за раз. Вы можете найти много статей в Google о синхронизации.

Пример:

    synchronized void yourMethodname(int x){//synchronized method  

// Your code block inside.

}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...