Поток 1 заполняет карту каждую секунду, а поток 2 сохраняет записи каждые 60 секунд - PullRequest
0 голосов
/ 23 января 2019

У меня есть запланированный пул исполнителей размера 2. 1 поток заполняет карту каждую секунду, а второй поток должен взять данные на карте и сохранить их в базе данных и очистить данные на карте. Каков наилучший способ поделиться картой между двумя потоками, чтобы данные не терялись?

1 Ответ

0 голосов
/ 24 января 2019

Общий ресурс map, чтобы получить правильный результат, нам нужно контролировать многопоточный доступ map. Можно использовать много методов:

  • используйте многопоточную карту типа ConcurrentHashMap
  • использовать блокировку для управления доступом к общему ресурсу несколькими потоками
  • изменить процесс, чтобы выполнить сериализацию операции.

В сцене, которую вы описали, блокировка с использованием thisk - самый простой метод, код такой:

private Lock lock = new ReentrantLock();
private Map<String, Object> dataSet = new HashMap<>();

private void fillDataSet(Map<String, Object> src) {
    lock.lock();
    try {
        dataSet.putAll(src);
    } finally {
        lock.unlock();
    }
}

private void dumpDataSet() {
    lock.lock();
    try {
        // save data to db adn clear the data set
        db.saveData(dataSet);
        dataSet.clear();
    } finally {
        lock.unlock();
    }
} 

Почему ConcurrentHashMap не идеальное решение для вас?

Thread2 должен прочитать карту и затем написать (очистить) карту ,, но в ConcurrentHashMap операции поиска (включая получение) обычно не блокируются, поэтому могут перекрываться с операциями обновления (включая операции добавления и удаления).

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