У меня есть собственный проект с этой функциональностью (упрощенно):
Получение запросов пользователей -> обработка их -> отправка ответа пользователю -> добавление этого ответа на локальную карту -> запись изменений в файл.
Следующий код (не закончен, не спроектирован, просто макет):
public class MultiThreadingTest {
public static ConcurrentMap<String, GooglePlayGame> map = new ConcurrentSkipListMap<>(String.CASE_INSENSITIVE_ORDER);
public static ObjectMapper mapper = new ObjectMapper()
.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false)
.setVisibility(PropertyAccessor.FIELD, JsonAutoDetect.Visibility.ANY)
.enable(SerializationFeature.INDENT_OUTPUT);
static {
TypeFactory typeFactory = mapper.getTypeFactory();
MapType mapType = typeFactory.constructMapType(ConcurrentSkipListMap.class, String.class, GooglePlayGame.class);
try {
ConcurrentMap<String, GooglePlayGame> temporary = mapper.readValue(new File(
"library.json"), mapType);
map.putAll(temporary);
} catch (IOException e) {
e.printStackTrace();
}
}
public static void main(String[] args) throws NotGooglePlayLinkException, IOException, URISyntaxException {
GooglePlayGame game = GooglePlayGame.builder()
.title(parser.parseTitle(document))
...
.build();
addToLib(parser.parseTitle(document), game);
writeToLib();
}
public static void addToLib(String title, GooglePlayGame game){
map.put(title, game);
}
public static void writeToLib() throws IOException {
mapper.writeValue(new File("library.json"), map);
}
}
Теперь мое приложение работает так:
получил запрос -> получил ответ -> добавить ответ в локальную библиотеку (карта) -> записать в файл -> отправить ответ пользователю.
Я хочу ускорить этот процесс:
получить запрос -> обработать его и получить ответ - > отправить ответ пользователю. Пока я посылаю этот ответ пользователю, в то же время (в другом потоке) я хочу добавить этот ответ на локальную карту, а затем записать его в файл.
Так что мне нужен другой поток, чтобы сохранить эти ответы. Но я буквально нуб в многопоточности.
- Должен ли я использовать где-то синхронизированный в этом случае?
- Должен ли я создать поток с помощью executorservice или просто использовать класс анонима, который реализует Runnable, и сделать что-то вроде этого:
Thread thread = new Thread(() -> writeToLib());
thread.start();
- Что если я не хочу записывать в файл каждый ответ, но если я получил 3 ответа, то записать в файл? Что я должен использовать для этого?
- Thread-safe? Я не должен пропустить ни одного запроса (я имею в виду, что все ответы должны быть написаны).
Поэтому главная цель - добавить / написать в библиотеку / файл в другом потоке и не тратить на это время пользователей. Они должны получать быстрые ответы на свои запросы.