Рефакторинг механизма синхронизации, чтобы не использовать экземпляр Thread в качестве монитора - PullRequest
0 голосов
/ 14 мая 2019

У меня есть устаревшее приложение, которое недавно было интегрировано с SonarQube.Строка this.notify ();внутри синхронизированного метода отображается ошибка, которая гласит: «Рефакторинг механизма синхронизации, чтобы не использовать экземпляр потока в качестве монитора» (методы «wait (...)», «notify ()» и «notifyAll ()» не должны бытьвызывается на экземплярах потоков).Я новичок в многопоточности.Кто-нибудь может указать, как решить проблему?Ниже приведен фрагмент кода

public synchronized void shutdown() {
        bShutdown = true;
        log.info("Shutting down Cleaner.");
        this.interrupt();
        try {
            this.wait(5000); // This line is causing sonar issue.
        } catch (InterruptedException ex) {
            log.warn("Cleaner shutdown notification received.");
            log.debug("Shutdown wait interrupted.", ex);
        }
        log.info("Cleaner shutdown ready.");
    }

У меня также есть переопределенный метод run (), который выглядит примерно так

public void run() {
        log.debug("Cleaner thread started.");
        bShutdown = false;
        while (!bShutdown) {
            try {
                onWakeUp();
                Thread.sleep(frequency * FREQUENCY_TO_MSEC_MULTIPLIER);
            } catch (InterruptedException ex) {
                log.debug("Cleaner thread Interrupted (probably for shutdown sequence)", ex);`enter code here`
            }
        }

        this.notifyShutdownReady();
    }

onWakeUp() method has some cleanup code

public synchronized void notifyShutdownReady() {
    this.notify();
}
...